我修改后的包功能版本找不到包的其他内部功能

时间:2018-10-30 11:47:08

标签: r namespaces package

我通过从Github复制功能代码并在我的环境as described here中替换了该功能,对软件包metafor中的某个功能进行了临时修改:

my.rma.uni = function(...) {
# here I simply copied the existing code with no modifications as a test
}

unlockBinding("rma.uni", as.environment("package:metafor"))
assign("rma.uni", rma.uni_mm, as.environment("package:metafor"))
lockBinding("rma.uni", as.environment("package:metafor"))

但是当我尝试现在运行rma.uni时,修改后的版本似乎无法找到metafor的其他内部功能:

Error in .chkdots(ddd, c("knha", "scale", "link", "outlist")) : 
  could not find function ".chkdots"

我还尝试了直接调用my.rma.uni(实际上这是我的偏好,这样我可以同时使用标准的rma.uni和我的版本),但这会产生相同的错误。

如何确保修改后的功能可以访问所有内部功能?

2 个答案:

答案 0 :(得分:2)

对于短期的入侵,我通常只是通过三元冒号访问任何必要的隐藏功能,例如metafor:::.chkdots。这太笨拙了(我通常会一遍又一遍地修复它们,因为它们失败了),并且不适合提交给CRAN等,但这对我有用。

答案 1 :(得分:1)

如果您需要函数从命名空间访问“私有”函数,则可以设置函数的环境。通常,功能会自动采用定义它们的环境。但是您可以通过编程方式更改它。

如果您只是这样做

T[]

然后,environment(my.rma.uni) <- as.environment("package:metafor") 函数将在metafor命名空间而不是全局命名空间中查找任何可用的符号。您可以做到这一点,而不会弄乱在名称空间中锁定/解锁绑定和分配。如果您要完全替换软件包中的功能,则只需执行操作。大多数情况下,最好在全局名称空间中创建自己的副本。