Removing/de-registering R 包中的特定函数

Removing/de-registering a specific function from an R package

我可能没有正确使用术语,请原谅我...

我有一个包的情况 'overwriting' 另一个包加载了一个具有相同名称的函数,从而改变了函数的行为(中断)。

具体案例:

X <- data.frame ( y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100) )

library(CausalImpact)
a <- CausalImpact::CausalImpact( X, c(1,75), c(76, 100) ) # works

library(bfast) # imports quantmod which loads crappy version of as.zoo.data.frame

b <- CausalImpact::CausalImpact( X, c(1,75), c(76, 100) ) # Error

我知道错误来自函数的两个版本 as.zoo.data.frame。 有问题的版本是由 bfast 从包 'quantmod' 导入的(参见 https://github.com/joshuaulrich/quantmod/issues/168)。不幸的是,他们的修补程序并没有阻止这个错误。超级讨厌。

我可以破解这个特定问题,但我 想知道是否有通用的方法来喜欢 'de-register' 这个函数 从搜索路径变体。 detachunloadNamespace 都没有删除有问题的功能(之后的行为相同)。讨论了一个解释和类似的问题 here and here,但我找不到通用的解决方案。例如,我宁愿只删除此功能,也不愿克隆并重新编写 CausalImpact 来处理此行为。

从 R 3.6.0 开始,有一个名为 "conflicts.policy" 的新选项可以在既定框架内处理此问题。对于像这样的小问题,您可以使用 library() 的新参数。如果您还没有到 3.6,最简单的解决方案可能是在需要时显式命名 CausalImpact,即 CausalImpact::CausalImpact。太啰嗦了,所以你可以 causal_impact <- CausalImpact::CausalImpact 并使用那个别名。

# only attach select
library(dplyr, include.only = "select")
# exclude slice/arrange from being attached.
library(dplyr, exclude = c("slice", "arrange")) 

library(bfast, exclude = "CausalImpact") 应该可以解决您的问题。

附加意味着它们可以在没有明确前缀的情况下使用它们的包。在任何一种情况下,像 dplyr::slice 这样的东西都可以正常工作。

更多信息可以查看?library。此外,R-Core 成员 Luke Tierney 撰写了一篇博客,解释了 conflicts.policy 的工作原理。你可以发现 here

这是一个可行的答案,但不如注销 S3 方法好,因为它涉及用所需方法替换 S3 方法 table 中的注册版本:

library(CausalImpact)
library(bfast) 
assignInNamespace("as.zoo.data.frame", zoo:::as.zoo.data.frame, ns = asNamespace("zoo"))

部分基于@smingerson 在评论中的建议