将对象添加到包命名空间
我想将一个函数推送到包命名空间内,以便它可以访问该包的内部对象(让我们使用 stats 包作为示例)。我尝试过使用
myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
但它被锁定了。所以我尝试解锁我的对象,
unlockBinding("myfun", env)
因为 myfun 尚不存在,所以我无法解锁它。
有什么帮助吗?
I'd like to push a function inside a package namespace so it can access internal objects of that package (let's use stats package as an example). I've tried using
myfun <- function(x) print(x)
env = loadNamespace("stats")
assign("myfun", myfun , env)
But it is locked. So I've tried to unlock my object
unlockBinding("myfun", env)
Since myfun doesn't exist yet, I can't unlock it.
Any help ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
沿着@Hadley的解决方案,但使用命名空间的环境,怎么样:
Along the line of @Hadley's solution, but using the environment of the namespace, how about:
为什么不将新函数的环境设置到正确的位置呢?
Why not just set the environment of your new function to the right place?
您可以使用三冒号运算符
:::
访问包的内部对象。例如,看一下as.roman
和utils:::.roman2numeric
。 (将此与 utils::.roman2numeric 进行比较。)这可以帮助您避免将函数放入命名空间中。您可能还想查看
mvbutils
包中的dont.lockBindings
,它可以阻止命名空间被锁定。You can access internal objects of a package using the triple colon operator
:::
. Take a look at, for example,as.roman
andutils:::.roman2numeric
. (Compare this toutils::.roman2numeric
.) This could help you avoid having to put your function inside the namespace.You might also want to look at
dont.lockBindings
in themvbutils
package, which stops namespaces being locked.