在函数内替换为列表作为环境

substitute within a function with list as environment

我想在这里了解 substitute 的行为,这里是我的例子,如果你 运行 这两个例子,f1 和 f2 给你“b”和“k”作为答案。这两个代码的唯一区别是,我添加了不包含任何 x 的 list(y = 'z')。我假设这不应该改变 substitute 的行为,但是它确实改变了。谁能告诉我这里发生了什么?非常感谢您

x <- 'a'
a <- 'b'

f1 <- function(x){
  s = substitute(x, list(y = 'z'))
  print(s) ## this returns x !!! why?
  a <- 'k'
  print(eval(s))
}
f1(a) ## returns "b" 


f2 <- function(x){
  s = substitute(x)
  print(s) ## this returns a which is fine.
  a <- 'k'
  print(eval(s))
}
f2(a) ## returns "k" 

这是因为substitute取的两个参数是

substitute(expr, env)
expr - any syntactically valid R expression
env  - an environment or a list object. Defaults to the current evaluation environment.

所以当您调用 substitute(x) 时,这与 substitute(x, environment()) 相同。 substitute 通过从本地函数环境中提取 promise 的值来获取用于调用函数的符号。如果您使用 substitute(x, list(y = 'z')),它将不再使用本地环境,因此它看不到作为参数传递的 x 值。