R中替代和引用之间的区别是什么

时间:2017-10-19 16:27:50

标签: r

在官方文档中,它说:

  

substitute返回(未评估的)表达式的解析树   expr,替换env。中绑定的任何变量。

     

引用只返回其参数。该参数未被评估   可以是任何R表达式。

但是当我尝试时:

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

看起来quotesubstitute都会返回作为参数传递给它们的表达式。

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

4 个答案:

答案 0 :(得分:24)

以下示例可帮助您轻松查看quote()substitute()之间的区别,其中一个设置(处理函数参数)substitute()最多常用:

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

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

答案 1 :(得分:8)

也许文档的这一部分会有所帮助:

  

通过检查解析树的每个组件来进行替换   如下:如果它不是env中的绑定符号,则不变。如果它   是一个承诺对象,即函数或函数的形式参数   使用delayedAssign()显式创建,表达式的槽   诺言取代了这个符号。如果它是普通变量,则其值   取代,除非env是.GlobalEnv,在这种情况下符号是   保持不变。

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

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

将其与:

进行比较
> quote(a)
a

因此,在进行替换时有两种基本情况:当我们在函数的参数上使用它时,以及env是某个环境时其他而不是{ {1}}。这就是为什么你的特定例子令人困惑的原因。

要与.GlobalEnv进行另一次比较,请考虑将示例部分中的quote函数修改为:

myplot

并且您会发现myplot <- function(x, y) plot(x, y, xlab = deparse(quote(x)), ylab = deparse(quote(y))) 确实没有做任何替换。

答案 2 :(得分:7)

R具有惰性评估,因此变量名称令牌的身份不如其他语言清晰。这在您可以编写的jQuery(window).on("scroll", function(){ // adblocker is the Id for the ad message // t3-header is the Id for the Nav bar var startY = 1; if(jQuery(window).scrollTop() > startY){ jQuery('#adblocker').slideUp("fast"); jQuery('#t3-header').css({position: 'fixed', top: '0px'}); }else{ jQuery('#adblocker').slideDown("fast"); jQuery('#t3-header').css({position: 'static', top: '80px'}); } }); 等库中使用,例如:

dplyr

我们可以询问每个令牌的含义:summarise(mtcars, total_cyl = sum(cyl)) summarise是定义的函数,sum是定义的数据框,mtcars是关键字参数函数total_cyl。但是什么是summarise

cyl

它不是什么!好吧,还没有。 R不会立即对其进行评估,而是将其作为一个表达式进行解析以后,其中一些解析树与您的命令行不同于全局环境在...工作,特别是定义> cyl Error: object 'cyl' not found 列的工作。在dplyr的内部某处,正在发生这样的事情:

mtcars

突然> substitute(cyl, mtcars) [1] 6 6 4 6 8 ... 意味着什么。这是cyl的用途。

那么substitute是什么?好吧,有时你希望你的懒惰评估表达式在其评估之前在其他地方表示,即你想显示你没有任何(或只是一些)写的实际代码价值取代。您引用的文档解释了这对于数据集和图表的信息标签很常见。&#34;

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

quote

请注意,expr <- quote(x + y) print(expr) # x + y eval(expr, list(x = 1, y = 2)) # 3 也可以执行此表达式技巧,同时为您提供仅解析其中一部分的选项。所以它的功能是substitute的超集。

quote

答案 3 :(得分:4)

关于你的问题为什么GlobalEnv被视为替代的例外,它只是S的遗产。来自R语言定义(https://cran.r-project.org/doc/manuals/r-release/R-lang.html#Substitutions):

  

在顶级替换的特殊例外无疑是特殊的。它是从S继承的,其基本原理很可能是无法控制哪个变量可以绑定在该级别,因此最好只用替代行为作为引用。