【发布时间】: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