2012-01-07 37 views
26

[这个问题已经在解决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已经给出了在这种情况下如何使用它和类似功能的很好的解释。

回答

34

要获得当前环境,请致电environment()

通常,sys.frame返回当前在调用堆栈上的任何环境,并且sys.nframe返回调用堆栈的当前深度。 sys.frames返回调用堆栈上所有环境的列表。

environment(f)返回函数f(它将查找函数和全局变量)的闭包环境。

parent.env(e)返回如果在e中找不到符号,它将在其中显示的父级环境。

f <- function() { 
    function() list(curEnv=environment(), parent=parent.env(environment()), 
      grandParent=parent.env(parent.env(environment())), callStack=sys.frames(), 
      callStackDepth=sys.nframe()) 
} 
g <- function(f, n=2) if (n>2) g(f, n-1) else f() 

floc <- f() # generate a local function 
g(floc, 3) # call it 

这将调用本地函数floc为3。堆栈深度它返回一个列表与当前的环境下,它的父(在f当地的环境),它的盛大母公司(其中f定义,所以globalenv)。它还返回堆栈帧(环境)的列表。这些是g中递归调用的环境(除了最后一个是当前环境floc)。

+0

这就是我在聊天室中所说的。现在@iterator,给他打勾:) – Spacedman 2012-01-08 13:04:11

+0

@Spacedman你有机会。:)汤米,谢谢 - 你对发生的事情的阐述是有帮助的。我知道Spacedman的聊天评论的答案,但不想让问题自我回答。正如你所做的那样,我希望有人能够提出更有说服力的解释。 – Iterator 2012-01-08 14:03:06

+0

curEnv与callStack [[3]]相同,父母和祖父母与其他callStacks完全不同,为什么? – qed 2013-06-10 13:54:00

相关问题