如何在下面的 R 代码中查询 foo 的 x 值?
make.foo <- function() {
x <- 123
function() x * 3
}
foo <- make.foo()
# now get foo's x
如何在下面的 R 代码中查询 foo 的 x 值?
make.foo <- function() {
x <- 123
function() x * 3
}
foo <- make.foo()
# now get foo's x
一个函数会有一个环境
从?`function`
闭包有三个组件,它的形式(它的参数列表),它的主体('Usage' 部分中的表达式)和它的环境,它在使用闭包时提供评估框架的外壳。
所以你可以get
从那个环境中(或使用列出的对象ls
)
get('x', envir = environment(foo))
## [1] 123
或者如果您想知道环境中的所有对象
ls(envir = environment(foo))
## 'x'
如果你想分配给那个环境(即 change x
)
assign('x', 24, envir = environment(foo))
foo()
## 72
您甚至可以将其从环境中移除
rm(x, envir = environment(foo))
foo()
## Error in foo() : object 'x' not found
然后使用全局分配的x
x <- 3
foo()
# [1] 9
并重新分配给function
's 环境
assign('x', 123, envir = environment(foo))
foo()
## [1] 369
如果你想在一个对象的环境中寻找一些东西而不是其他地方,那么使用get
with inherits=FALSE
。否则,您将冒险在函数的父环境中找到东西。make.foo
使用上述示例:
> z=999
> get("x",environment(foo))
[1] 123
> get("z",environment(foo))
[1] 999
> get("x",environment(foo),inherits=FALSE)
[1] 123
> get("z",environment(foo),inherits=FALSE)
Error in get("z", environment(foo), inherits = FALSE) :
object 'z' not found
第二个get
表明,如果您尝试获取不在闭包环境中的东西(如果它出现在父环境中),您可能不会收到错误。这可能会导致奇怪的错误。随着inherits=FALSE
您立即出现错误。