【问题标题】:Add objects to package namespace将对象添加到包命名空间
【发布时间】:2011-03-06 20:56:31
【问题描述】:

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

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

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

unlockBinding("myfun", env)

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

有什么帮助吗?

【问题讨论】:

    标签: r r-package


    【解决方案1】:

    按照@Hadley的解决方案,但是使用命名空间的环境,怎么样:

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

    【讨论】:

    • 如果您需要修改现有的包函数,该函数将被其他包函数调用,here is the solution
    【解决方案2】:

    为什么不把新函数的环境设置在正确的位置?

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

    【讨论】:

    • 我不知道!但我想我希望它是 namespace:stats 而不是 package:stats。有没有办法做到这一点(只是在 as.environment() 中更改它不起作用)。
    • 我迟到了,但这可能对其他人有用:命名空间实际上是一个环境。 namespace:stats 是一个后代全局环境并包含所有对象。导出的对象被复制到package:stats,它是全局环境的祖先
    【解决方案3】:

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

    您可能还想查看mvbutils 包中的dont.lockBindings,它会阻止命名空间被锁定。

    【讨论】:

    • 如果我理解正确,一旦包的命名空间被锁定,我就无法解锁它(除非使用 dont.lockBindings 重新加载它)。所以不可能后验添加一个新函数。
    • @Etiennebr:我相信你是对的。一旦命名空间被锁定,您就不能添加到它。我仍然认为::: 是继续前进的方式。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2023-03-24
    • 2017-09-21
    相关资源
    最近更新 更多