R 替代品不能按预期工作
根据文件 替换是通过检查解析树的每个组件来实现的,如下所示:如果它不是env中的绑定符号,则保持不变。如果它是promise对象,即函数的形式参数或使用delayedAssign()显式创建的,promise的表达式槽将替换符号。如果是普通变量,则替换其值,除非env为.GlobalEnv,在这种情况下,符号保持不变 所以我做了一些实验R 替代品不能按预期工作,r,R,根据文件 替换是通过检查解析树的每个组件来实现的,如下所示:如果它不是env中的绑定符号,则保持不变。如果它是promise对象,即函数的形式参数或使用delayedAssign()显式创建的,promise的表达式槽将替换符号。如果是普通变量,则替换其值,除非env为.GlobalEnv,在这种情况下,符号保持不变 所以我做了一些实验 a = 10 # first f1 = function(x){ substitute(x) } f1(a) # [1] a # second f
a = 10
# first
f1 = function(x){
substitute(x)
}
f1(a)
# [1] a
# second
f1 = function(x){
x
substitute(x)
}
f1(a)
# [1] a
# third
f1 = function(x){
force(x)
substitute(x)
}
f1(a)
# [1] a
# fourth
f1 = function(x){
x = x
substitute(x)
}
f1(a)
# [1] 10
在第二个和第三个实验中,我假设x不再是承诺,因此substitute
应该返回10
,而不是a
。但它仍然返回a
。为什么? 来自:
在访问该参数之前,没有与
答应我。访问参数时,存储的表达式为
在存储环境中计算,并返回结果。这个
承诺也挽救了结果。替代函数将
提取表达式槽的内容。这允许程序员
访问与
答应我
即使已对其表达式求值,承诺仍保持承诺。您可以看到pryr软件包发生了什么:
library(pryr)
f=function(x){
print(promise_info(x))
force(x)
promise_info(x)
}
a <- 10
f(a)
#$code
#a
#
#$env
#<environment: R_GlobalEnv>
#
#$evaled
#[1] FALSE
#
#$value
#NULL
############################
#$code
#a
#
#$env
#NULL
#
#$evaled
#[1] TRUE
#
#$value
#[1] 10
库(pryr)
f=函数(x){
打印(承诺信息(x))
力(x)
承诺信息(x)
}
在第二和第三种情况下,未分配x
和force(x)
。同样地,substitute(x)
在这两种情况下都作为x
的原始值返回,即如果分配了force(x)
,则返回a
,例如,语言定义中的f1:“在访问该参数之前,承诺没有任何相关价值。访问参数时,将在存储环境中对存储表达式求值,并返回结果。承诺也挽救了结果。替换函数将提取表达式槽的内容。这允许程序员访问与承诺相关联的值或表达式。“承诺即使其表达式已被求值,也仍然是承诺。@AdamQuek我同意这与是否分配了x
有关。但是substitute
如何检测x
已分配?如果使用ls.str(environment())
可以看到x
已经绑定到10
@Roland,我明白了。因此,除非promisex
被局部变量“x”覆盖,否则无论是否对其求值,它都将保持一个promise。