在 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
是不正确的。加载 forecast
和 arfima
我们只看到 :
methods(BIC)
[1] BIC.arfima*
(并且在预测的索引页面上没有建议在该包中定义 AIC 或 BIC。因此,预测函数创建的任何对象都将由 AIC.default 处理,并且预计BIC 失败。
我有一个包交集问题。 我使用 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
是不正确的。加载 forecast
和 arfima
我们只看到 :
methods(BIC)
[1] BIC.arfima*
(并且在预测的索引页面上没有建议在该包中定义 AIC 或 BIC。因此,预测函数创建的任何对象都将由 AIC.default 处理,并且预计BIC 失败。