【发布时间】:2016-12-14 02:01:03
【问题描述】:
我想将自定义环境中的函数附加到全局环境,同时屏蔽可能的内部函数。
具体来说,说f()使用了一个内部函数g(),那么:
-
f()不应该在.GlobalEnv和ls(all=TRUE)中可见。 -
f()应该可以从.GlobalEnv使用。 -
f()内部函数g()应该不可见并且不可从.GlobalEnv使用。
首先让我们创建如下环境和函数:
assign('ep', value=new.env(parent=.BaseNamespaceEnv), envir=.BaseNamespaceEnv)
assign('e', value=new.env(parent=ep), envir=ep)
assign('g', value=function() print('hello'), envir=ep)
assign('f', value=function() g(), envir=ep$e)
ls(.GlobalEnv)
## character(0)
我现在应该跑吗:
ep$e$f()
## Error in ep$e$f() (from #1) : could not find function "g"
其实f的调用环境是:
environment(get('f', envir=ep$e))
## <environment: R_GlobalEnv>
g 不存在。
试图改变f的环境报错:
environment(get('f', envir=ep$e))=ep
## Error in environment(get("f", envir = ep$e)) = ep :
## target of assignment expands to non-language object
显然它适用于:
environment(ep$e$f)=ep
attach(ep$e)
现在,根据需要,只有 f() 可以从 .GlobalEnv 使用,g() 不可用。
f()
[1] "hello"
g()
## Error: could not find function "g" (intended behaviour)
此外,f() 和 g() 都无法从 .GlobalEnv 看到,但不幸的是:
ls(.GlobalEnv)
## [1] "ep"
将与f() 关联的环境设置为ep,将ep 放置在.GlobalEnv 中。
混乱的全球环境正是我试图避免的。
我可以重置f 的父环境而不使其在全局环境中可见吗?
更新
根据您的反馈,您建议构建一个包以获得适当的命名空间服务。
包装不灵活。我的辅助函数存储在项目子目录中,例如 hlp,来源类似于 source("hlp/util1.R")。
通过这种方式,脚本可以很容易地在项目的基础上进行混合和更新。
(在顶部添加了新的枚举列表)
更新 2
现在是here 一个几乎完整的解决方案,不需要外部包。
【问题讨论】:
-
“混乱的全球环境正是我想要避免的。”只需构建一个包。
-
@Roland:请看更新版本。