我在这里使用的术语可能不正确,请原谅我...
我遇到一种情况,一个程序包“覆盖”另一个程序包加载的同名函数,从而改变了函数的行为(中断)。
具体情况:
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)。不幸的是,他们的修补程序无法防止出现此错误。超级烦人。
我可以解决这个特定的问题,但是我想知道是否有一种通用方法可以从搜索路径中“注销”此功能变量。
detach
和unloadNamespace
都不会删除有问题的功能(此后的行为相同)。 here和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)撰写了博客,解释了冲突策略的工作原理。您可以找到here