在 R 中调用方法时如何隐藏包交集

How to hide packages intersection when method called in R

我有一个包交集问题。 我使用 arfima 和 forecast 包,它们都有相同的名称方法(如 AIC、BIC 等)。

因此,当我尝试 运行 代码时,我遇到了方法不匹配的问题 - R 尝试使用上次加载的包中的方法。是的,我知道我可以通过“::”调用导出的方法。与这些方法的内部代码相关的主要问题 - 它们在方法主体中使用自己的包方法而没有“::”。例如,当我尝试使用 运行 此代码时:

require(arfima);
require(forecast);

x <- rnorm(100);
fit <- arfima::arfima(x);
summary(fit);

它给出了这些错误:

> fit <- arfima::arfima(x);
Note: autoweed is ON.  It is possible, but not likely,
 that unique modes may be lost.
Beginning the fits with 2 starting values.

> summary(fit);
Error in AIC.logLik(logl) :unrealized  type (29) in 'eval'

因此,此代码 w/o 加载的预测包运行良好(我 运行 它在 "clear" R 会话中):

require(arfima);
#require(forecast);

x <- rnorm(100);
fit <- arfima::arfima(x);
summary(fit);

# Note: autoweed is ON.  It is possible, but not likely,
# that unique modes may be lost.
# Beginning the fits with 2 starting values.
# 
# summary(fit);
# 
# Call:
#  
# arfima::arfima(z = x)
# 
# 
# Mode 1 Coefficients:
#               Estimate Std. Error Th. Std. Err.  z-value Pr(>|z|)
# d.f         -0.0208667  0.0770519     0.0779679 -0.27081  0.78653
# Fitted mean -0.0432115  0.0845518            NA -0.51107  0.60930
# sigma^2 estimated as 0.851957; Log-likelihood = 8.51214; AIC = -11.0243; BIC = 282.976
#
# Numerical Correlations of Coefficients:
#             d.f   Fitted mean
# d.f          1.00 -0.09      
# Fitted mean -0.09  1.00      
# 
# Theoretical Correlations of Coefficients:
#     d.f 
# d.f 1.00
# 
# Expected Fisher Information Matrix of Coefficients:
#     d.f 
# d.f 1.65

那么,是否可以隐藏部分或执行代码的包?像这样:

require(arfima);
#require(forecast);

hide(forecast);

x <- rnorm(100);
fit <- arfima::arfima(x);
summary(fit);

unhide(forecast);

或者像这样:

require(arfima);
#require(forecast);

used(arfima);

x <- rnorm(100);
fit <- arfima::arfima(x);
summary(fit);

unused(arfima);

也许您应该更新所有软件包安装并重试。使用新安装的 arfima 的二进制副本,我没有发现您的代码有任何错误。 AIC 是通用的,当您查看加载的方法时,您确实会看到 class "arfima" 的对象,因此不需要使用“::”函数:

> methods(AIC)
[1] AIC.arfima*  AIC.default* AIC.logLik* 
see '?methods' for accessing help and source code

有一个 detach 函数,但它通常不足以完全搁置一个包,除非它的 "unload" 参数设置为 TRUE,在这种情况下可能有点矫枉过正,因为您的诊断似乎是不正确的。这表明该策略是可行的,但我仍然怀疑没有必要:

require(arfima);
require(forecast);
detach(package:forecast,unload=TRUE)
x <- rnorm(100);
fit <- arfima::arfima(x);
summary(fit); library(forecast)

这表明 summary 有 class 个特定的方法,因此应该没有因包混淆而导致的错误:

> methods(summary)
 [1] summary,ANY-method             summary,DBIObject-method      
 [3] summary,quantmod-method        summary.aov                   
 [5] summary.aovlist*               summary.arfima*               
 [7] summary.Arima*                 summary.arma*                 
 [9] summary.aspell*                summary.check_packages_in_dir*
[11] summary.connection             summary.data.frame            
[13] summary.Date                   summary.default               
[15] summary.ecdf*                  summary.ets*                  
[17] summary.factor                 summary.forecast*       
snipped res

此外,您认为存在 forecast::BIC 是不正确的。加载 forecastarfima 我们只看到 :

 methods(BIC)
[1] BIC.arfima*

(并且在预测的索引页面上没有建议在该包中定义 AIC 或 BIC。因此,预测函数创建的任何对象都将由 AIC.default 处理,并且预计BIC 失败。