Перегрузка функций S3 разными параметрами в R - PullRequest
1 голос
/ 13 марта 2019

Это продолжение опубликованного вопроса Создание функции с другими аргументами в 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?

...