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().

调用的父级