如何在R中的函数中引用本地环境?

Ite*_*tor 30 namespaces r

[这个问题已在Spacedman聊天室中得到解决,但我将在未来将其发布给其他人使用.]

我有一个函数,myFunclocalFunc在其中创建.(注意:这不是在一个软件包中,而是在全局环境中.)我想知道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)
}
Run Code Online (Sandbox Code Playgroud)

但是,调用myFunc()似乎并不表示localFunc调用data.table().这是不正确的 - 是什么给出的?

(注意:where参数指定搜索路径.)


更新1:正如Tommy和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)
Run Code Online (Sandbox Code Playgroud)

这出现在这个问题的答案中,在一个名为的函数中checkScriptDependencies,它将R脚本文件中的代码包装到本地函数中,然后由本地函数进行分析foodweb.这是如何使用的有限示例environment(),并且Tommy在此上下文中给出了如何使用它和类似函数的良好解释.

Tom*_*mmy 44

要获得当前环境,只需致电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
Run Code Online (Sandbox Code Playgroud)

这将调用floc堆栈深度为3 的本地函数.它返回一个列表,其中包含当前环境,它的父项(本地环境中f),以及它的祖父项(f已定义的位置,因此globalenv).它还返回堆栈帧(环境)列表.这些是递归调用的环境g(除了最后一个是当前环境floc).