2015-06-15 74 views
9

我一直在閱讀關於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

當函數執行完時'x'被銷燬 – jenesaisquoi

+2

'environment'函數返回'function'對象的環境,而不是任意對象的環境。 – nicola

+0

@nicola謝謝,我沒有意識到這一點。 – Robert

回答

6

當函數完成執行時(除非您在其他持久性環境中專門創建它們),函數調用中創建的變量將被銷燬。正如@joran所指出的那樣,當一個函數被調用時,會創建一個臨時環境,其中定義了局部變量,並且在函數完成執行時釋放內存。但是,正如@MrFlick指出的那樣,如果該函數返回一個函數,則返回的函數將維護對其創建環境的引用。您可以閱讀關於'scope','stack', and '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 
+2

也許另一種在上面說出你的評論的方法是在執行'f'時,R爲'f'創建一個持續執行函數的持續時間的環境。但是一旦「f」完成,環境(以及其中的全部內容)就會丟失。 – joran

+1

@joran那麼,如果該函數返回另一個函數或公式,函數的環境就可能存在。 'f <-function(x){a <-x + 1; function()a};環境(F(5))'。在這種情況下,每次函數運行時都會創建一個新環境,並且在函數退出後它會繼續存在以及其中的變量'a'。 'X <-f(5); x()' – MrFlick

+1

感謝您提供豐富的解釋。 – Robert

6

pryr有一些很好的功能來做這些事情。例如,有一個名爲where功能,這將給你一個對象的環境:

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

所以x環境是由功能f()創建的臨時環境。正如人們之前所說的,這個環境在運行該功能後被破壞,因此每次運行f()時都會給出不同的結果。

+0

謝謝,卡洛斯 - 我會試一試。 – Robert

相關問題