如何解决在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
的环境),因此应该在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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。