问题描述
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
的环境),因此应该在z
内部的b
被打印。而是在全局环境中打印的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>