R eval():当参数“ envir”显式设置为默认值时更改了行为

时间:2018-12-12 00:50:22

标签: r eval

考虑功能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测试)

为什么?这种行为是故意的吗?

1 个答案:

答案 0 :(得分:3)

在函数的评估框中评估函数的默认值。在调用框架中评估显式参数。 (这两种方法都可以通过非标准的评估技巧来更改,但是您并没有使用它们。)

因此,在您的第一个示例中,parent.frame()是对eval()的调用的父级,即fun1()的求值框架。在第二个示例中,parent.frame()是对fun2()的调用的父级。