3

如何在下面的 R 代码中查询 foo 的 x 值?

make.foo <- function() {
    x <- 123
    function() x * 3
}

foo <- make.foo()

# now get foo's x
4

2 回答 2

3

一个函数会有一个环境

?`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
于 2012-09-28T05:28:01.640 回答
3

如果你想在一个对象的环境中寻找一些东西而不是其他地方,那么使用getwith 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您立即出现错误。

于 2012-09-28T07:15:55.000 回答