2017-10-19 129 views
11

在官方文档替代和报价之间的差异,它说:什么是R中

替代返回解析树的(未评估)表达 EXPR,代入ENV结合的任何变量。

引用只是返回它的参数。该参数未被评估,并且 可以是任何R表达式。

但是当我尝试:

> x <- 1 
> substitute(x) 
x 
> quote(x) 
x 

看起来既quotesubstitute返回那等于参数传递他们的表达。

所以我的问题是,substitutequote之间有什么区别,以及“代替env中的任何变量”是什么意思?

+0

这是一个非常好的资源,我怀疑我可以比哈德利解释得更好 - http://adv-r.had.co.nz/Computing-on-the-language.html –

回答

10

下面是一个例子,可以帮助你轻松地看到quote()substitute()之间的区别,在这里是最常用substitute()的设置(处理函数参数)之一:

f <- function(argX) { 
    list(quote(argX), substitute(argX), argX) 
} 

suppliedArgX <- 100 
f(argX = suppliedArgX) 
# [[1]] 
# argX 
# 
# [[2]] 
# suppliedArgX 
# 
# [[3]] 
# [1] 100 
5

也许本节文档将有所帮助:如果不是在一个ENV势必象征,它是不变的:

换人通过检查如下解析树 的每个部件发生。如果它是 是承诺对象,即,使用delayedAssign()明确创建的函数或 的正式参数,则承诺的表达式槽替换该符号。如果它是一个普通变量,其值 被替换,除非env是.GlobalEnv,在这种情况下,符号 保持不变。

注意的最后一位,并考虑这个例子:

e <- new.env() 
assign(x = "a",value = 1,envir = e) 
> substitute(a,env = e) 
[1] 1 

相比之下,与:

> quote(a) 
a 

所以有些时候会发生替代两种基本情况:当我们在函数的参数上使用它,并且env是某些环境其他而不是.GlobalEnv。所以这就是你特别的例子令人困惑的原因。

对于另一个比较quote,考虑修改myplot功能中的示例部分是:

myplot <- function(x, y) 
    plot(x, y, xlab = deparse(quote(x)), 
      ylab = deparse(quote(y))) 

,你会看到quote真的没有做任何替代。

+0

嗯,这很有趣,谢谢你的回答。出于好奇,为什么GlobalEnv被视为替代品的例外?谢谢! –

+0

@LifuHuang我真的不知道。 – joran

+0

不用担心,谢谢你的出色答案:) –

1

R有懒惰的评价,所以变量名称标识的标识比其他语言稍微不清楚。这是用在像dplyr库,你可以写,例如:

summarise(mtcars, total_cyl = sum(cyl)) 

我们还可以知道这些记号的意思是:summarisesum定义功能,mtcars是一个定义的数据帧,total_cyl是关键词参数为功能summarise。但是什么是cyl

> cyl 
Error: object 'cyl' not found 

这不是什么!那么,还没有。 R并不立即对其进行评估,而是将其视为要解析的表达式稍后与某些解析树与您的命令行正在处理的全局环境不同,具体而言,其中定义了mtcars列。某处在dplyr的胆量,这样的事情正在发生:

> substitute(cyl, mtcars) 
[1] 6 6 4 6 8 ... 

突然cyl意味着什么。这就是substitute的用途。

那么什么是quote?那么有时候,你希望你的懒惰评估的表达式在之前被评估为,即你想显示你正在编写的实际代码而没有任何(或只有一些)值被替换。您引用的文档解释了这对于“数据集和图的信息标签”很常见。

因此,例如,您可以创建一个带引号的表达式,然后在图表中打印未评估的表达式,以显示如何计算并实际计算的表达式。

expr <- quote(x + y) 
print(expr) # x + y 
eval(expr, list(x = 1, y = 2)) # 3 

注意substitute能做到这一点表情也伎俩同时给你解析的只是其中的一部分的选项。所以它的功能是quote的超集。

expr <- substitute(x + y, list(x = 1)) 
print(expr) # 1 + y 
eval(expr, list(y = 2)) # 3