什么';在R中替换和引用的区别是什么

什么';在R中替换和引用的区别是什么,r,R,在官方文件中,它说: 替换返回(未赋值)表达式的解析树 expr,替换env中绑定的任何变量 quote只返回其参数。未对参数进行求值,并且 可以是任何R表达式 expr <- quote(x + y) print(expr) # x + y eval(expr, list(x = 1, y = 2)) # 3 但当我尝试时: > x <- 1 > substitute(x) x > quote(x) x >x替换(x) x >报价(x) x 它看起来像是qu

在官方文件中,它说:

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

quote只返回其参数。未对参数进行求值,并且 可以是任何R表达式

expr <- quote(x + y)
print(expr) # x + y
eval(expr, list(x = 1, y = 2)) # 3
但当我尝试时:

> x <- 1
> substitute(x)
x
> quote(x)
x
>x替换(x)
x
>报价(x)
x
它看起来像是
quote
substitute
都返回作为参数传递给它们的表达式


所以我的问题是,
substitute
quote
之间有什么区别,以及“替换绑定在env中的任何变量”意味着什么?

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

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

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

e <- new.env()
assign(x = "a",value = 1,envir = e)
> substitute(a,env = e)
[1] 1
因此,有两种基本情况下会发生替换:当我们在函数的参数上使用它时,以及当
env
.GlobalEnv
以外的环境时。这就是为什么你的例子让人困惑的原因

另一个与Quest的比较,考虑修改示例段中的<代码> MyPrase>代码>函数:

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

myplotR具有延迟求值,因此变量名标记的标识比其他语言中的标识稍不清晰。这在库中使用,如
dplyr
,您可以在其中编写,例如:

summarise(mtcars, total_cyl = sum(cyl))
我们可以询问这些标记的含义:
summary
sum
是定义的函数,
mtcars
是定义的数据帧,
total_-cyl
是函数
summary
的关键字参数。但是什么是共青团呢

> 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

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


f关于您的问题,为什么GlobalEnv被视为替代的例外,它只是S的一个遗产。来自R语言定义():

无可否认,在最高层进行替换的特殊例外是特殊的。它是从S继承而来的,其基本原理很可能是无法控制哪些变量可能会在该级别上绑定,因此最好只使用替代变量作为引用


这是一个非常好的资源,我怀疑我能比哈德利更好地解释它-嗯,这很有趣,谢谢你的回答。出于好奇,为什么GlobalEnv被视为替代品的例外?谢谢!@李福煌我真的不知道。谢谢,这是我唯一能理解的答案!在帮助或在线文档中包含像您这样的示例真的很难吗=(
expr <- substitute(x + y, list(x = 1))
print(expr) # 1 + y
eval(expr, list(y = 2)) # 3