R:隐藏一些功能的源个人脚本
R: Source personal scripts keeping some functions hidden
跟进
我想在给定环境中获取脚本源代码,例如在 sys.source
中,但是 "exporting" 只有一些功能并保持其他功能 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
:
来源 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()
在哪里?我还能找回吗?
使用:
get("g",env=environment(f))
## function ()
## print("hello")
## <environment: 0x0000000018780c30>
ls(parent.env(environment(f)))
## [1] "g"
感谢 Alexander Griffith 的解决方案。
跟进
我想在给定环境中获取脚本源代码,例如在 sys.source
中,但是 "exporting" 只有一些功能并保持其他功能 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
:
来源 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()
在哪里?我还能找回吗?
使用:
get("g",env=environment(f))
## function ()
## print("hello")
## <environment: 0x0000000018780c30>
ls(parent.env(environment(f)))
## [1] "g"
感谢 Alexander Griffith 的解决方案。