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 次 |
最近记录: |