- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在某种程度上是 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 现在不知道如何在 Arima
类的对象上使用 stats::fitted
。
接下来在我的代码中,我需要 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 方法。如果您有兴趣,这里更详细地介绍了这种情况的发生方式和原因。
加载forecast包后,它定义的所有方法都会“注册”在各种不同命名空间的数据库中。 R 遵循的规则是方法在定义其 S3 泛型的包的命名空间中注册。由于 fitted()
泛型是在 stats 中定义的,因此这是在名为 的环境中注册由 forecast 定义的新方法的地方.__S3MethodsTable__.
。分离或卸载 forecast 不会影响 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/
我是一名优秀的程序员,十分优秀!