Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中重载具有不同参数的S3函数_R_Oop_Overloading_Generic Function_Method Dispatch - Fatal编程技术网

在R中重载具有不同参数的S3函数

在R中重载具有不同参数的S3函数,r,oop,overloading,generic-function,method-dispatch,R,Oop,Overloading,Generic Function,Method Dispatch,这是对已发布问题的跟进 我创建了一个泛型函数,但却无法将不同的参数集传递给这些函数 modelBuild <- function(x, ...) { UseMethod("modelBuild") } modelBuild.auto.arima <- function(x, ...) { forecast::auto.arima(x) } 在nnetar modelBuild.nnetar <- function(x, repeats, ...

这是对已发布问题的跟进

我创建了一个泛型函数,但却无法将不同的参数集传递给这些函数

modelBuild <- function(x, ...) {
    UseMethod("modelBuild")
   }

modelBuild.auto.arima <- function(x, ...) {
      forecast::auto.arima(x)
  }
nnetar

modelBuild.nnetar <- function(x, repeats, ...) {
     forecast::nnetar(x, repeats = 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 

为了纠正它,我在每个
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)

  }
这是在
R
中创建泛型函数的最佳实践,还是有一种方法可以为每个
methodBuild
定义一个参数有限的方法,它仍然可以调用,而不必定义特定函数不需要的参数。我正在寻找类似于
java

这可以在
S4
R6
方法系统中解决吗

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 
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.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