这个问题是对this question的后续。
考虑下面的例子

set.seed(1)
x <- cumsum(rnorm(10))
y <- stats::arima(x, order = c(1, 0, 0))
length(stats::fitted(y))
[1] 0
到目前为止一切顺利:返回零是因为 R 现在不知道如何在 stats::fitted 类的对象上使用 Arima
接下来在我的代码中,我需要 forecast 包中的一个函数。我没有附加包,我只是使用 :: 表示法加载它。
在下面的代码中,我将使用 requireNamespace 直接加载它。
requireNamespace("forecast", quietly = TRUE)
length(stats::fitted(y))
[1] 10
突然,相同的命令返回不同的结果。
我理解为什么会发生这种情况(我希望我说的是对的):通过加载 forecast 包,泛型函数 fitted (即 fitted.Arima )的一个新方法被加载到命名空间中,这会导致不同的结果。
对我来说,这种行为很烦人:有没有办法选择 fitted 的特定方法?
我读了 this chapter 但不知道如何规避这个问题。
我也尝试从命名空间卸载 forecast 包,但没有成功:
unloadNamespace("forecast")
length(stats::fitted(y))
[1] 10
似乎一旦我加载了包,我就不能使用 fitted 的旧方法。
我想知道如何处理这些情况。
编辑
正如在 unloadNamespace("forecast") 之后的评论中指出的那样,我明白了
isNamespaceLoaded("forecast")
[1] FALSE
但是 methods 安装仍然包括 fitted.Arima

最佳答案

@CalumYou 指出卸载命名空间不会删除为另一个包中定义的 S3 泛型注册的 S3 方法,这是完全正确的。在这里,如果您有兴趣,可以更详细地了解情况如何以及为什么会出现这种情况。

预测 包被加载时,它定义的所有方法都在各种不同命名空间的数据库中“注册”。遵循的规则R是,方法在定义其S3泛型的程序包的 namespace 中注册。由于 fitted() 泛型是在 stats 中定义的,这就是 预测 定义的新方法在名为 .__S3MethodsTable__. 的环境中注册的地方。分离或卸载 预测 使 stats 包保持不变(如果你考虑一下,这可能是一个整体明智的设计决定),不幸的后果是 fitted.Arima 方法(以及许多其他方法)仍然在其 .__S3MethodsTable__ 中注册。

要了解情况是否如此,请查看以下内容:

isNamespaceLoaded("forecast")
## [1] FALSE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
## [1] "fitted.default"       "fitted.isoreg"        "fitted.kmeans"
## [4] "fitted.nls"           "fitted.smooth.spline"

## Loading the forecast namespace registers new 'fitted' methods ...
requireNamespace("forecast", quietly = TRUE)
isNamespaceLoaded("forecast")
## [1] TRUE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
##  [1] "fitted.ar"              "fitted.Arima"           "fitted.arma"
##  [4] "fitted.bats"            "fitted.default"         "fitted.ets"
##  [7] "fitted.fracdiff"        "fitted.garch"           "fitted.gls"
## [10] "fitted.glsStruct"       "fitted.gnls"            "fitted.gnlsStruct"
## [13] "fitted.isoreg"          "fitted.kmeans"          "fitted.lagwalk"
## [16] "fitted.lme"             "fitted.lmeStruct"       "fitted.lmList"
## [19] "fitted.modelAR"         "fitted.nlmeStruct"      "fitted.nls"
## [22] "fitted.nnetar"          "fitted.quantmod"        "fitted.smooth.spline"
## [25] "fitted.tbats"           "fitted.tslm"            "fitted.values.quantmod"

## ... which are left behind even when the forecast namespace is unloaded
unloadNamespace("forecast")
isNamespaceLoaded("forecast")
## [1] FALSE
ls(stats:::.__S3MethodsTable__., pattern = "fitted")
##  [1] "fitted.ar"              "fitted.Arima"           "fitted.arma"
##  [4] "fitted.bats"            "fitted.default"         "fitted.ets"
##  [7] "fitted.fracdiff"        "fitted.garch"           "fitted.gls"
## [10] "fitted.glsStruct"       "fitted.gnls"            "fitted.gnlsStruct"
## [13] "fitted.isoreg"          "fitted.kmeans"          "fitted.lagwalk"
## [16] "fitted.lme"             "fitted.lmeStruct"       "fitted.lmList"
## [19] "fitted.modelAR"         "fitted.nlmeStruct"      "fitted.nls"
## [22] "fitted.nnetar"          "fitted.quantmod"        "fitted.smooth.spline"
## [25] "fitted.tbats"           "fitted.tslm"            "fitted.values.quantmod"

(对于相关的问答, see here 。)

关于r - R 中的命名空间和泛型函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55378596/

10-10 07:14