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

如何查询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

如何在下面的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
?`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。非常感谢你。