我一直在阅读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)
但那也返回了一个错误.任何帮助将不胜感激.
函数调用中创建的变量在函数完成执行时被销毁(除非您在其他持久环境中专门创建它们).正如@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)
该软件包pryr具有一些很好的功能来完成这些事情.例如,有一个函数被调用where,它将为您提供对象的环境:
library(pryr)
f <- function() {
x <- 1
where("x")
}
f()
<environment: 0x0000000013356f50>
Run Code Online (Sandbox Code Playgroud)
所以环境x是由功能创造的临时环境f().正如人们之前所说的,在运行该函数后,这个环境会被破坏,因此每次运行时它都会给你一个不同的结果f().