将对象添加到包命名空间

Eti*_*ine 35 r r-package

我想在一个包命名空间中推送一个函数,以便它可以访问该包的内部对象(让我们使用stats包作为例子).我试过用了

myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
Run Code Online (Sandbox Code Playgroud)

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

unlockBinding("myfun", env)
Run Code Online (Sandbox Code Playgroud)

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

有帮助吗?

小智 35

沿着@Hadley的解决方案,但使用命名空间的环境,如何:

environment(myfun) <- asNamespace('stats')
Run Code Online (Sandbox Code Playgroud)


had*_*ley 19

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

myfun <- function(x) print(x)
environment(myfun) <- as.environment("package:stats")
Run Code Online (Sandbox Code Playgroud)

  • 我迟到了,但这可能对其他人有用:命名空间实际上是一个环境.`namespace:stats`是_descendent_全局环境并包含所有对象.导出的对象被复制到`package:stats`,这是全局环境的_ancestor_. (7认同)

Ric*_*ton 6

您可以使用三重冒号运算符访问包的内部对象:::.例如,看看as.romanutils:::.roman2numeric.(比较一下utils::.roman2numeric.)这可以帮助您避免将函数放在命名空间中.

您可能还希望dont.lockBindingsmvbutils包中查看,这会阻止名称空间被锁定.