哪个函数将识别R变量的封闭环境的名称?

时间:2015-06-15 21:46:55

标签: r

我一直在阅读R环境,我试图用一个简单的例子来测试我的理解:

> f <- function() {
+   x <- 1
+   environment(x)
+ }
> 
> f()
NULL

我假设这意味着对象x被名为NULL的环境包围,但是当我尝试列出该环境中的所有对象时,R显示错误消息:

> ls(NULL)
Error in as.environment(pos) : using 'as.environment(NULL)' is defunct

所以我想知道是否有一个内置函数我可以在命令行上使用它将返回给定对象名称的环境名称。我试过这个:

> environment(x)
Error in environment(x) : object 'x' not found

但也返回了错误。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:6)

函数调用中创建的变量在函数完成执行时被销毁(除非您在其他持久环境中专门创建它们)。正如@joran指出的那样,当一个函数被调用时,会创建一个临时环境,其中定义了局部变量,并在函数执行完毕后被销毁(该内存被释放)。但是,正如@MrFlick指出的那样,如果函数返回一个函数,则返回的函数会维护对其创建环境的引用。您可以阅读更多关于&#39; scope&#39;,{{ 3}}。在R中,有多种方法可以将变量定义到指定的环境中。

f <- function()  {
    x <<- 1  # create x in the global environment (or change it if it's there)
    ## or `assign` x to a value
    ## assign(x, value=1, envir=.GlobalEnv)
}
environment(f)  # where was f defined?
exists("x", envir=.GlobalEnv)
# [1] TRUE

答案 1 :(得分:6)

pryr有一些很好的功能来完成这些事情。例如,有一个名为where的函数可以为您提供对象的环境:

library(pryr)
f <- function() {
    x <- 1
    where("x")
}
f()
<environment: 0x0000000013356f50>

因此x的环境是由函数f()创建的临时环境。正如人们之前所说的那样,运行该函数后会破坏此环境,因此每次运行f()时都会给出不同的结果。

相关问题