我通过从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
和我的版本),但这会产生相同的错误。
如何确保修改后的功能可以访问所有内部功能?
答案 0 :(得分:2)
对于短期的入侵,我通常只是通过三元冒号访问任何必要的隐藏功能,例如metafor:::.chkdots
。这太笨拙了(我通常会一遍又一遍地修复它们,因为它们失败了),并且不适合提交给CRAN等,但这对我有用。
答案 1 :(得分:1)
如果您需要函数从命名空间访问“私有”函数,则可以设置函数的环境。通常,功能会自动采用定义它们的环境。但是您可以通过编程方式更改它。
如果您只是这样做
T[]
然后,environment(my.rma.uni) <- as.environment("package:metafor")
函数将在metafor命名空间而不是全局命名空间中查找任何可用的符号。您可以做到这一点,而不会弄乱在名称空间中锁定/解锁绑定和分配。如果您要完全替换软件包中的功能,则只需执行操作。大多数情况下,最好在全局名称空间中创建自己的副本。