2014-12-03 60 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()) ,執行代碼的效果變得更容易推理和預測。更少的驚喜使更好的代碼!)