跟进this
我希望在给定环境中提供脚本,例如在sys.source
中,但只“导出”某些功能并保持其他功能私有。
我创建了这个函数:
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
:
源2( “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()
在哪里?我还能找回来吗?
答案 0 :(得分:0)
使用:
$columns = array_fill_keys(['A', 'B', 'H'], true);
array_walk(
$data,
function(&$row) use ($columns) {
$row = array_intersect_key($row, $columns);
}
);
感谢Alexander Griffith的解决方案。