Это продолжение опубликованного вопроса Создание функции с другими аргументами в R
Я создал универсальную функцию, но застрял с передачей различных функций этим функциям
modelBuild <- function(x, ...) {
UseMethod("modelBuild")
}
modelBuild.auto.arima <- function(x, ...) {
forecast::auto.arima(x)
}
Теперь я хочу добавить параметр model
в modeBuild.ets
modelBuild.ets <- function(x, model, ...) {
forecast::ets(x, model = model)
}
и другой параметр в nnetar
modelBuild.nnetar <- function(x, repeats, ...) {
forecast::nnetar(x, repeats = repeats)
}
Функция modelBuild
вызывается другой функцией
forecast_all <- function(data, algo_name, model = "ZZZ", repeats = 20 , ...) {
class(data) <- c(class(data), algo_name)
modelBuild(data, model, repeats, ...)
}
Теперь мы тестируем на воспроизводимом примере
set.seed(1)
a <- runif(100) * 2.5
forecast_all(a, "auto.arima")
Series: x
ARIMA(0,0,0) with non-zero mean
Coefficients:
mean
1.2946
s.e. 0.0666
sigma^2 estimated as 0.4475: log likelihood=-101.19
AIC=206.38 AICc=206.5 BIC=211.59
forecast_all(a, "ets", model = "ZZZ")
ETS(M,N,N)
Call:
forecast::ets(y = x, model = model)
Smoothing parameters:
alpha = 1e-04
Initial states:
l = 1.2947
sigma: 0.5194
AIC AICc BIC
385.1151 385.3651 392.9306
nnetar
приводит к ошибке
forecast_all(a, "nnetar", repeats = 22)
Error in 1:repeats : NA/NaN argument
In addition: Warning message:
In avnnet(lags.X[j, , drop = FALSE], y[j], size = size, repeats = repeats, :
NAs introduced by coercion
Чтобы исправить это, я включил все параметры в качестве входных данных в каждый из modelBuild
modelBuild.auto.arima <- function(x, model, repeats, ...) {
forecast::auto.arima(x)
}
modelBuild.ets <- function(x, model, repeats, ...) {
forecast::ets(x, model = model)
}
modelBuild.nnetar <- function(x, model, repeats, ...) {
forecast::nnetar(x, repeats = repeats)
}
Теперь все функции работают как положено
forecast_all(a, "auto.arima")
Series: x
ARIMA(0,0,0) with non-zero mean
Coefficients:
mean
1.2946
s.e. 0.0666
sigma^2 estimated as 0.4475: log likelihood=-101.19
AIC=206.38 AICc=206.5 BIC=211.59
forecast_all(a, "ets", model = "ZZZ")
ETS(M,N,N)
Call:
forecast::ets(y = x, model = model)
Smoothing parameters:
alpha = 1e-04
Initial states:
l = 1.2947
sigma: 0.5194
AIC AICc BIC
385.1151 385.3651 392.9306
forecast_all(a, "nnetar", repeats = 22)
Series: x
Model: NNAR(1,1)
Call: forecast::nnetar(y = x, repeats = repeats)
Average of 22 networks, each of which is
a 1-1-1 network with 4 weights
options were - linear output units
sigma^2 estimated as 0.4297
Является ли это наилучшей практикой для создания универсальных функций в R
или есть способ определить метод с ограниченными параметрами для каждого methodBuild
, при этом его можно вызывать без определения параметров, которые не требуются для конкретной функции , Я ищу поведение перегрузки функций, аналогичное java
Может ли это быть решено в методе S4
или R6
?