2015-10-16 37 views
4

程序員經常在較大的函數中使用多個小函數。一路上,我們可能想收集環境中的東西供以後參考。我們可以用new.env(hash=FALSE)創建一個環境,並將其傳遞給較小的函數,並使用assign進行賦值。好吧,花花公子。我想知道我們是否可以使用環境的引用ID,而不是將它傳遞給子函數,但仍然通過引用環境ID來分配給環境。通過引用ID分配給環境(即不將環境傳遞給子函數)

所以我在這裏做

myenv <- new.env(hash=FALSE) 
## <environment: 0x00000000588cc918> 

而作爲典型的可分配這樣的,如果我一起子函數環境過去了。

assign("elem1", 35, myenv) 

myenv[["elem1"]] 
# 35 

我要的是讓父功能環境並一起傳遞參考ID代替我想要做的事,如:

assign("elem2", 123, "0x00000000588cc918") 

但可預見的結果是:

## Error in as.environment(pos) : 
## no item called "0x00000000588cc918" on the search list 

是否有可能只傳遞環境ID並使用它呢?這似乎比將環境從函數傳遞到函數並作爲列表返回,然後在該列表中的環境中操作更清潔......並且也許更有效地利用內存。

我也想通過引用來訪問這個環境。

+1

@ G.Grothendieck謝謝你,良好的信息。主要動機是將字符引用ID從函數傳遞到函數並進行適當修改會更容易。然後,我們不必每次都從子功能返回環境。 –

+1

@TylerRinker「這很容易」 - 再來一次?不,它更復雜。我的意思是,甚至沒有簡單的方法來獲得這個環境的內部十六進制標識符(你本質上需要執行'capture.output(print(myenv))'然後解析結果,實際上,忘記了十六進制標識符,它只是讓漂亮環境具有唯一標識的漂亮打印的一部分,除此之外,它對R程序員沒有任何意義 –

+0

我的印象是「唯一標識符」/「環境ID」只是對象的內存地址,否?例如'E < - new.env(); sub(「。+ \\ s(。+?)> $」,「\\ 1」,capture.output( print(E)))== data.table :: address(E)'。但無論如何,看作R並不直接提供以這種方式訪問​​環境的方法(我知道),試圖做所以可能比它的價值更麻煩。 – nrussell

回答

2

環境不像列表。將環境傳遞給函數不會複製其內容,即使在函數內部修改了環境的內容,也不必擔心效率低下。此外,當環境傳遞給修改其內容的函數時,即使在函數完成後內容也會保留,所以與列表的情況不同,不需要將環境傳遞回去。

例如,下面的代碼通過環境e功能ff修改它的內容,但不會將其傳回。在f完成後,呼叫者看到更改。

f <- function(x, env) { 
     env$X <- x 
     TRUE 
    } 

    e <- new.env() 
    f(1, e) 
    ## [1] TRUE 

    e$X 
    ## [1] 1 

更多關於Hadely的書enviorments:http://adv-r.had.co.nz/Environments.html

相關問題