R eval():当参数';envir';显式设置为默认值

R eval():当参数';envir';显式设置为默认值,r,eval,R,Eval,考虑函数fun1()。调用它不会将值2分配给中的xx fun1 <- function(x) eval(expr=substitute(x)) fun1({xx <- 2; xx}) ## [1] 2 xx ## Error: object 'xx' not found fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame()) fun2({xx <- 2; xx}) ## [1] 2 xx #

考虑函数
fun1()
。调用它不会将值
2
分配给
中的
xx

fun1 <- function(x) eval(expr=substitute(x)) 
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2
fun2()
中,参数
envir
被显式设置为其默认值
parent.frame()
。调用
fun2()
会在
.GlobalEnv
中将值
2
分配给
xx

fun1 <- function(x) eval(expr=substitute(x)) 
fun1({xx <- 2; xx})
## [1] 2
xx
## Error: object 'xx' not found
fun2 <- function(x) eval(expr=substitute(x), envir=parent.frame())
fun2({xx <- 2; xx})
## [1] 2
xx
## [1] 2

fun2函数的默认值在函数的求值框中求值。显式参数在调用框架中求值。(这两种方法都可以通过非标准评估技巧进行更改,但您不能使用它们。)


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

的父对象,谢谢。您能否更明确地说明更改这两种行为的“非标准求值技巧”?您可以使用
substitute(arg)
将表达式作为参数传递,并使用
eval()
在您选择的任何环境中对其求值。请参阅Wickham的高级R编程书中的非标准评估章节。