【问题标题】:R: Source personal scripts keeping some functions hiddenR:源个人脚本隐藏一些功能
【发布时间】:2016-12-17 22:15:48
【问题描述】:

关注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:

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

【问题讨论】:

  • 我们不只是制作一个包,为什么?
  • @hrbrmstr:请参阅问题头中设置的链接中的第一个更新和接受的答案
  • 这篇够长了,谢谢。您正在复制软件包中固有的功能,并且几乎不需要额外的时间来制作 pkg 或更新 pkg。
  • @hrbrmstr:是的,这是一个 hack,但我认为越来越多的 R 模块包证明了这些 design principles 是有根据的。

标签: r module scope packages scoping


【解决方案1】:

用途:

get("g",env=environment(f))
## function ()
## print("hello")
## <environment: 0x0000000018780c30>

ls(parent.env(environment(f)))
## [1] "g"

感谢 Alexander Griffith 的解决方案。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多