考虑功能fun1()
。名为不会将值2
分配给xx
中的.GlobalEnv
。
fun1 <- function(x) eval(expr=substitute(x))
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
envir
的参数eval()
的默认值为:
formals(eval)$envir
## parent.frame()
在fun2()
中,参数envir
被显式设置为其默认值parent.frame()
。调用fun2()
确实会,将值2
分配给xx
中的.GlobalEnv
。
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2
(已通过R版本3.5.0测试)
为什么?这种行为是故意的吗?
答案 0 :(得分:3)
在函数的评估框中评估函数的默认值。在调用框架中评估显式参数。 (这两种方法都可以通过非标准的评估技巧来更改,但是您并没有使用它们。)
因此,在您的第一个示例中,parent.frame()
是对eval()
的调用的父级,即fun1()
的求值框架。在第二个示例中,parent.frame()
是对fun2()
的调用的父级。