R:隐藏某些功能的源个人脚本

时间:2016-12-16 19:03:03

标签: r module scope packages scoping

跟进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()在哪里?我还能找回来吗?

1 个答案:

答案 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的解决方案。