如何在R中查询闭包中符号的值?

3
我该如何查询以下 R 代码中 foo 的 x 值?

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

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

foo <- make.foo()

# now get foo's x
2个回答

3

一个函数会有一个环境

来自 ?`function`

闭包有三个组成部分:形参(参数列表)、主体(使用部分中的表达式)和环境,它在使用闭包时提供了评估框架的封闭。

因此,您可以从该环境中获取(或使用ls列出对象)

get('x', envir = environment(foo))
## [1] 123

或者如果您想了解环境中的所有对象

ls(envir = environment(foo))
## 'x'

如果您想指定给该环境(即更改 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

并重新分配到 函数 的环境中

assign('x', 123, envir = environment(foo))
foo()
## [1] 369

3
如果您想在一个对象的环境中查找某些内容,而不是其他地方,那么请使用getinherits=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会立即报错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接