2014-12-03 65 views
4

这是一个后续到这里的答案efficiently move environment from inside function to global environment,其中指出,有必要参考返回这是一个函数内部创建的,如果一个人希望与环境如何找到未引用的环境?

的内容,一个工作环境,这是真的如果我们不返回引用,那么新创建的环境会继续存在,如果有的话,我们如何追踪这样的环境,要么访问它的内容,要么删除它?

+0

我不认为这是真的。你在Windows上吗?你可以用'memory.size'来检查。 – 2014-12-03 16:37:20

+0

@MatthewPlourde如果我正确地解释Josh的回答,那这是真的。 – 2014-12-03 20:43:23

+0

是的,我误读了OP。 – 2014-12-03 20:46:52

回答

4

当然,如果它被分配到函数评估环境之外的某个符号(就像在OP的例子中那样),一个环境将会继续存在。从这个意义上说,一个环境就像任何其他名为R的对象一样。 (即未分配的环境可以通过closures保持存在的事实是否意味着环境有时会持续,而其他类型的对象也不会,但是这不是这里发生了什么。)

## OP's example function 
funfun <- function(inc = 1){ 
    dataEnv <- new.env() 
    dataEnv$d1 <- 1 + inc 
    dataEnv$d2 <- 2 + inc 
    dataEnv$d3 <- 2 + inc 
    assign('dataEnv', dataEnv, envir = globalenv()) ## Assignment to .GlobalEnv 
} 
funfun() 
ls(env=.GlobalEnv) 
# [1] "dataEnv" "funfun" 

## It's easy to find environments assigned to a symbol in another environment, 
## if you know which environment to look in. 
Filter(isTRUE, eapply(.GlobalEnv, is.environment)) 
# $dataEnv 
# [1] TRUE 

在OP的例子,它是相对易于追踪,因为环境被分配到.GlobalEnv中的符号。但是,一般情况下(和其他R对象一样),如果它被分配给列表中的元素或更复杂的结构,将很难追查到。顺便说一句,这就是为什么R和其他更纯粹的函数式语言通常不鼓励非局部赋值的原因,当函数只返回一个值,并且该值只通过显式赋值赋予符号(如v <- f()) ,执行代码的效果变得更容易推理和预测。更少的惊喜使更好的代码!)