将对象添加到包命名空间
我想在包命名空间内部推送一个函数,以便它可以访问该包的内部对象(让我们使用统计包作为示例)。我试过使用将对象添加到包命名空间
myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
但它被锁定。所以我试图解锁我的对象
unlockBinding("myfun", env)
由于myfun尚不存在,我无法解锁它。
任何帮助吗?
沿@哈德利的解决方案的路线,但使用的命名空间,怎么样的环境:
environment(myfun) <- asNamespace('stats')
您可以使用三重冒号运算符:::
来访问程序包的内部对象。看看,例如,as.roman
和utils:::.roman2numeric
。 (将其与utils::.roman2numeric
进行比较。)这可以帮助您避免必须将函数放入命名空间中。
您可能还想查看mvbutils
软件包中的dont.lockBindings
,该软件包会停止名称空间被锁定。
如果我理解正确的话,我不能解锁包的命名空间一旦被锁定(除用dont.lockBindings重新加载它)。所以不可能在事后添加新的函数。 – 2010-06-22 15:03:43
@Etiennebr:AFAIK你是对的。一旦名字空间被锁定,你就不能添加到它。我仍然认为':::'是继续下去的方法。 – 2010-06-22 15:14:22
为什么不只是将新功能的环境设置在正确的位置?
myfun <- function(x) print(x)
environment(myfun) <- as.environment("package:stats")
太好了,非常感谢! – TMS 2016-07-08 09:24:41