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

Rob*_*ert 9 r

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

> f <- function() {
+   x <- 1
+   environment(x)
+ }
> 
> f()
NULL
Run Code Online (Sandbox Code Playgroud)

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

> ls(NULL)
Error in as.environment(pos) : using 'as.environment(NULL)' is defunct
Run Code Online (Sandbox Code Playgroud)

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

> environment(x)
Error in environment(x) : object 'x' not found
Run Code Online (Sandbox Code Playgroud)

但那也返回了一个错误.任何帮助将不胜感激.

pic*_*ick 6

函数调用中创建的变量在函数完成执行时被销毁(除非您在其他持久环境中专门创建它们).正如@joran指出的那样,当一个函数被调用时,会创建一个临时环境,其中定义了局部变量,并在函数执行完毕后被销毁(该内存被释放).但是,正如@MrFlick指出的那样,如果函数返回一个函数,则返回的函数会维护对其创建环境的引用.您可以阅读有关" scope ","stack"和"heap"的更多信息.在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
Run Code Online (Sandbox Code Playgroud)

  • 也许在上面说出你的评论的另一种方式是,当执行`f`时,R为`f`创建一个持续执行函数持续时间的环境.但是一旦`f`完成,环境(以及其中的所有内容)就会丢失. (2认同)

Car*_*lli 6

该软件包pryr具有一些很好的功能来完成这些事情.例如,有一个函数被调用where,它将为您提供对象的环境:

library(pryr)
f <- function() {
    x <- 1
    where("x")
}
f()
<environment: 0x0000000013356f50>
Run Code Online (Sandbox Code Playgroud)

所以环境x是由功能创造的临时环境f().正如人们之前所说的,在运行该函数后,这个环境会被破坏,因此每次运行时它都会给你一个不同的结果f().