在官方文档中,它说:
substitute返回(未评估的)表达式的解析树 expr,替换env。中绑定的任何变量。
引用只返回其参数。该参数未被评估 可以是任何R表达式。
但是当我尝试时:
> x <- 1
> substitute(x)
x
> quote(x)
x
看起来quote
和substitute
都会返回作为参数传递给它们的表达式。
所以我的问题是,substitute
和quote
之间的区别是什么,以及“替换env中绑定的任何变量”是什么意思?
答案 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继承的,其基本原理很可能是无法控制哪个变量可以绑定在该级别,因此最好只用替代行为作为引用。