在函数内替换为列表作为环境
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
值。
我想在这里了解 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
值。