我这里可能没有正确地使用术语,所以请原谅我.
我有一种情况,即一个包“覆盖”一个由另一个包加载的具有相同名称的函数,从而改变函数的行为(中断)。
具体情况:
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都不删除违规函数(之后的行为相同)。我们讨论了这里和这里的解释和类似的问题,但是我无法找到一个通用的解决方案。例如,我宁愿删除这个函数,也不愿克隆和重写CausalImpact来处理这种行为。
发布于 2019-11-25 03:44:20
下面是一个可行的答案,但它不如取消注册S3方法更好,因为它涉及用所需的方法替换S3方法表中的注册版本:
library(CausalImpact)
library(bfast)
assignInNamespace("as.zoo.data.frame", zoo:::as.zoo.data.frame, ns = asNamespace("zoo"))部分基于@smingerson在评论中的建议
发布于 2019-11-23 04:47:17
从R3.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-核心成员卢克·蒂尔尼( Luke )写了一个博客,解释conflicts.policy的工作原理。你可以找到这里
https://stackoverflow.com/questions/59004588
复制相似问题