[這個問題已經在解決chat room, by Spacedman,但我張貼他人在未來受益。]如何在R中引用函數中的本地環境?
我有一個函數,myFunc
,它在其中創建localFunc
。 (注意:這不是在一個包中,而是在全球環境中。)我想知道在搜索路徑中存在localFunc
,因爲我想通過mvbutils::foodweb
進行分析。
下面是一個例子:
myFunc <- function(){
require(data.table)
require(mvbutils)
localFunc <- function(x){
return(as.data.table(x))
}
vecPrune <- c("localFunc",ls("package:data.table"))
ix <- match("data.table",search())
tmpWeb <- foodweb(where = c(1,ix), prune = vecPrune, plotting = FALSE)
return(tmpWeb)
}
然而,myFunc()
呼叫似乎並不表明localFunc
電話data.table()
。這是不正確的 - 什麼給了?
(NB:本where
參數指定的搜索路徑。)
更新1:作爲托米和Spacedman指出,關鍵是要指定environment()
。撥打foodweb()
的電話是指where = c(1, ix)
。索引1
是一個錯誤。這是因爲認爲.GlobalEnv
,它經常(總是?)search()
矢量中的第一項,是搜索的正確位置。這是錯誤的。相反,應該參考environment()
,正確的調用如下。 (NB:ix
指定data.table()
在search()
輸出的位置)
tmpWeb <- foodweb(where = c(environment(),ix), prune = vecPrune, plotting = FALSE)
這出現在回答this question,在稱爲checkScriptDependencies
函數,它包裝從R腳本文件中的代碼轉換爲本地函數,然後通過foodweb
進行分析。這是如何使用environment()
的一個有限例子,Tommy已經給出了在這種情況下如何使用它和類似功能的很好的解釋。
這就是我在聊天室中所說的。現在@iterator,給他打勾:) – Spacedman 2012-01-08 13:04:11
@Spacedman你有機會。:)湯米,謝謝 - 你對發生的事情的闡述是有幫助的。我知道Spacedman的聊天評論的答案,但不想讓問題自我回答。正如你所做的那樣,我希望有人能夠提出更有說服力的解釋。 – Iterator 2012-01-08 14:03:06
curEnv與callStack [[3]]相同,父母和祖父母與其他callStacks完全不同,爲什麼? – qed 2013-06-10 13:54:00