程序員經常在較大的函數中使用多個小函數。一路上,我們可能想收集環境中的東西供以後參考。我們可以用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並使用它呢?這似乎比將環境從函數傳遞到函數並作爲列表返回,然後在該列表中的環境中操作更清潔......並且也許更有效地利用內存。
我也想通過引用來訪問這個環境。
@ G.Grothendieck謝謝你,良好的信息。主要動機是將字符引用ID從函數傳遞到函數並進行適當修改會更容易。然後,我們不必每次都從子功能返回環境。 –
@TylerRinker「這很容易」 - 再來一次?不,它更復雜。我的意思是,甚至沒有簡單的方法來獲得這個環境的內部十六進制標識符(你本質上需要執行'capture.output(print(myenv))'然後解析結果,實際上,忘記了十六進制標識符,它只是讓漂亮環境具有唯一標識的漂亮打印的一部分,除此之外,它對R程序員沒有任何意義 –
我的印象是「唯一標識符」/「環境ID」只是對象的內存地址,否?例如'E < - new.env(); sub(「。+ \\ s(。+?)> $」,「\\ 1」,capture.output( print(E)))== data.table :: address(E)'。但無論如何,看作R並不直接提供以這種方式訪問環境的方法(我知道),試圖做所以可能比它的價值更麻煩。 – nrussell