跟进此
我想在给定环境中源脚本,例如在sys.source
中,但仅"导出"一些功能并保留其他功能 private 。
我创建了此功能:
source2=function(script){
ps=paste0(script, "_")
assign(ps, new.env(parent=baseenv()))
assign(script, new.env(parent=get(ps)))
private=function(f){
fn=deparse(substitute(f))
assign(fn, f, parent.env(parent.frame()))
rm(list=fn, envir=parent.frame())
}
assign("private", private, get(script))
sys.source(paste0(script, ".R"), envir=get(script))
rm(private, envir=get(script))
attach(get(script), name=script)
}
在大多数情况下,此函数按预期工作。
考虑脚本:
## foo.R
f=function() g()
g=function() print('hello')
private(g)
注意private()
功能,它将隐藏g()
。
如果我可以说,导入模块 foo
:
source2(" foo")
我在搜索路径中有一个新环境:
search()
## [1] ".GlobalEnv" "foo" "package:stats"
## [4] "package:graphics" "package:grDevices" "package:utils"
## [7] "package:datasets" "package:methods" "Autoloads"
## [10] "package:base"
当前环境.GlobalEnv
仅显示:
ls()
## [1] "source2"
但是,如果我在foo
环境中列出项目:
ls("foo")
## [1] "f"
因此我可以运行:
f()
## [1] "hello"
问题是g()
完全隐藏了。
getAnywhere(g)
## no object named 'g' was found
太多了。实际上,如果我想调试f()
:
debug(f)
f()
debugging in: f()
## Error in f() : could not find function "g"
问题是:g()
在哪里?我还能检索吗?
使用:
get("g",env=environment(f))
## function ()
## print("hello")
## <environment: 0x0000000018780c30>
ls(parent.env(environment(f)))
## [1] "g"
信用额为亚历山大·格里菲斯(Alexander Griffith)寻求解决方案。