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' 这个函数 从搜索路径变体。 detach
和 unloadNamespace
都没有删除有问题的功能(之后的行为相同)。讨论了一个解释和类似的问题 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 在评论中的建议
我可能没有正确使用术语,请原谅我...
我有一个包的情况 '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' 这个函数 从搜索路径变体。 detach
和 unloadNamespace
都没有删除有问题的功能(之后的行为相同)。讨论了一个解释和类似的问题 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 在评论中的建议