首页 > 解决方案 > 什么时候不应该使用 assignInNamespace?

问题描述

我有一个用例,我暂时想覆盖package:::function()测试,或者因为我只会以新的方式使用该函数一次。

我发现assignInNamespace哪个可以完成这项工作,例如

joke <- function(...) {return("hurz")}
assignInNamespace(x = "add1.glm", value = joke, pos = "package:stats")
stats:::add1.glm()
# [1] "hurz"

??assignInNamespace但是来自包utils状态的文档

警告:assignInNamespace 不应在最终代码中使用,如果从包中调用,将来会抛出错误。已经不允许某些用途。

不幸的是,我找不到这个警告的真正含义,如果这个功能assignInNamespace在一段时间内完全被弃用,那将是很长的时间。有没有遗漏任何文件?


编辑:我想,这将主要影响我自己的包裹。

标签: rnamespaces

解决方案


如果您想出于测试目的执行此操作,则最好使用trace(stats:::add1.glm, edit = TRUE). 这将允许您用您想要的任何代码临时替换函数的主体,并untrace(stats::add1.glm)恢复原始代码。trace()将来被删除或大幅限制的可能性很小。

出于 Konrad 所述的原因,您不应该尝试在生产代码中执行此操作。


推荐阅读