在R中,eval没有在正确的环境中进行评估


z <- 1
a <- function() {
print(parent.frame())
eval(quote({print(z)}))
}
b <- function() {
z <- 2
print(environment())
a()
}
b()
# output:
<environment: 0x55f0020b1af0>
<environment: 0x55f0020b1af0>
[1] 1

根据文件:

Usage
eval(expr, envir = parent.frame(),
enclos = if(is.list(envir) || is.pairlist(envir))
parent.frame() else baseenv())

由于envir参数默认为parent.frame(),即函数b的环境,因此应该打印的是b内部的z。但打印的却是全局环境中的z

eval的父帧是eval的调用方,而不是a的调用方。

# same as eval except for addition of print statement
my.eval <- function (expr, envir = parent.frame(), enclos = if (is.list(envir) || 
is.pairlist(envir)) parent.frame() else baseenv())  {
print(envir)
.Internal(eval(expr, envir, enclos))
}
z <- 1
a <- function() {
print(environment())
my.eval(quote({print(z)}))
}
b <- function() {
z <- 2
a()
}
b()
## <environment: 0x000000000b208d20>
## <environment: 0x000000000b208d20>