gpt4 book ai didi

r - R 中的命名空间和泛型函数

转载 作者:行者123 更新时间:2023-12-03 02:00:27 24 4
gpt4 key购买 nike

这个问题在某种程度上是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com