2010-06-22 66 views
29

我想在包命名空间内部推送一个函数,以便它可以访问该包的内部对象(让我们使用统计包作为示例)。我试过使用将对象添加到包命名空间

myfun <- function(x) print(x) 
env = loadNamespace("stats") 
assign("myfun", myfun , env) 

但它被锁定。所以我试图解锁我的对象

unlockBinding("myfun", env) 

由于myfun尚不存在,我无法解锁它。

任何帮助吗?

回答

28

沿@哈德利的解决方案的路线,但使用的命名空间,怎么样的环境:

environment(myfun) <- asNamespace('stats') 
+0

太好了,非常感谢! – TMS 2016-07-08 09:24:41

7

您可以使用三重冒号运算符:::来访问程序包的内部对象。看看,例如,as.romanutils:::.roman2numeric。 (将其与utils::.roman2numeric进行比较。)这​​可以帮助您避免必须将函数放入命名空间中。

您可能还想查看mvbutils软件包中的dont.lockBindings,该软件包会停止名称空间被锁定。

+0

如果我理解正确的话,我不能解锁包的命名空间一旦被锁定(除用dont.lockBindings重新加载它)。所以不可能在事后添加新的函数。 – 2010-06-22 15:03:43

+0

@Etiennebr:AFAIK你是对的。一旦名字空间被锁定,你就不能添加到它。我仍然认为':::'是继续下去的方法。 – 2010-06-22 15:14:22

14

为什么不只是将新功能的环境设置在正确的位置?

myfun <- function(x) print(x) 
environment(myfun) <- as.environment("package:stats") 
+0

我不知道!但我想我希望它是名称空间:统计数据,而不是package:stats。有没有办法做到这一点(只是改变它在as.environment()不起作用)。 – 2010-06-23 17:54:17

+1

命名空间不是环境... – hadley 2010-06-24 01:25:42

+7

我迟到了,但这可能对其他人有用:名称空间实际上是一个环境。 'namespace:stats'是一个_descendent_全局环境并包含所有的对象。导出的对象被复制到'package:stats',它是全局环境的_ancestor_。 – wch 2012-08-07 00:04:18

相关问题