R 替代品不能按预期工作

R 替代品不能按预期工作,r,R,根据文件 替换是通过检查解析树的每个组件来实现的,如下所示:如果它不是env中的绑定符号,则保持不变。如果它是promise对象,即函数的形式参数或使用delayedAssign()显式创建的,promise的表达式槽将替换符号。如果是普通变量,则替换其值,除非env为.GlobalEnv,在这种情况下,符号保持不变 所以我做了一些实验 a = 10 # first f1 = function(x){ substitute(x) } f1(a) # [1] a # second f

根据文件

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

所以我做了一些实验

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,我明白了。因此,除非promise
x
被局部变量“x”覆盖,否则无论是否对其求值,它都将保持一个promise。