这个问题是对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/