如何查询R中闭包中的符号值?
如何在下面的R代码中查询foo的x值如何查询R中闭包中的符号值?,r,closures,environment,R,Closures,Environment,如何在下面的R代码中查询foo的x值 make.foo <- function() { x <- 123 function() x * 3 } foo <- make.foo() # now get foo's x make.foo函数将有一个环境 ls(envir = environment(foo)) ## 'x' assign('x', 123, envir = environment(foo)) foo() ## [1] 369 从?`func
make.foo <- function() {
x <- 123
function() x * 3
}
foo <- make.foo()
# now get foo's x
make.foo函数将有一个环境
ls(envir = environment(foo))
## 'x'
assign('x', 123, envir = environment(foo))
foo()
## [1] 369
从?`function`
闭包有三个组成部分,其形式(其参数列表)、主体(在“用法”部分中的expr)和使用闭包时提供评估框架的环境
因此,您可以从该环境中获取
(或使用ls
列出对象)
或者,如果希望了解环境中的所有对象
ls(envir = environment(foo))
## 'x'
assign('x', 123, envir = environment(foo))
foo()
## [1] 369
如果要分配给该环境(即更改x
)
您甚至可以将其从环境中删除
rm(x, envir = environment(foo))
foo()
## Error in foo() : object 'x' not found
然后使用全局分配的x
assign('x', 24, envir = environment(foo))
foo()
## 72
x <- 3
foo()
# [1] 9
如果您想在对象的环境中查找某个对象,而不是在其他任何地方,请使用get
和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时,会立即出现错误。Beautiful。非常感谢你。