R eval():当参数 'envir' 明确设置为默认值时更改行为
R eval(): changed behavior when argument 'envir' is explicitly set to default value
考虑函数 fun1()
。调用它 不会 将值 2
分配给 .GlobalEnv
中的 xx
。
fun1 <- function(x) eval(expr=substitute(x))
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
eval()
的参数 envir
的默认值为:
formals(eval)$envir
## parent.frame()
在 fun2()
中,参数 envir
明确设置为其默认值 parent.frame()
。调用 fun2()
会 将值 2
赋给 .GlobalEnv
中的 xx
。
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2
(使用 R 版本 3.5.0 测试)
这是为什么呢?这种行为是故意的吗?
函数的默认值在函数的评估框架中进行评估。显式参数在调用框架中计算。 (这两个都可以通过非标准的评估技巧来改变,但你没有使用它们。)
因此在您的第一个示例中,parent.frame()
是对 eval()
调用的父级,即 fun1()
的评估框架。在您的第二个示例中,parent.frame()
是对 fun2()
.
调用的父级
考虑函数 fun1()
。调用它 不会 将值 2
分配给 .GlobalEnv
中的 xx
。
fun1 <- function(x) eval(expr=substitute(x))
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
eval()
的参数 envir
的默认值为:
formals(eval)$envir
## parent.frame()
在 fun2()
中,参数 envir
明确设置为其默认值 parent.frame()
。调用 fun2()
会 将值 2
赋给 .GlobalEnv
中的 xx
。
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2
(使用 R 版本 3.5.0 测试)
这是为什么呢?这种行为是故意的吗?
函数的默认值在函数的评估框架中进行评估。显式参数在调用框架中计算。 (这两个都可以通过非标准的评估技巧来改变,但你没有使用它们。)
因此在您的第一个示例中,parent.frame()
是对 eval()
调用的父级,即 fun1()
的评估框架。在您的第二个示例中,parent.frame()
是对 fun2()
.