[这个问题已经在解决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