Ite*_*tor 30 namespaces r
[这个问题已在Spacedman的聊天室中得到解决,但我将在未来将其发布给其他人使用.]
我有一个函数,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)
}
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).
| 归档时间: |
|
| 查看次数: |
16962 次 |
| 最近记录: |