R:如何为R6类定义多个构造函数?

时间:2016-01-26 23:20:44

标签: r r6

我目前正在开发一个项目,我需要在R中构建一个R6 class,可以通过多种方式进行初始化。我想知道最好的方法是什么。是否可以重载$new()函数?或者我需要定义辅助函数?

作为一个激励性的例子:我希望有一个R6类MyClass的两个构造函数,其字段为names,可以使用向量variable_names或整数{{来初始化1}}(在这种情况下,它初始化名称的默认向量)。

功能应该像这样:

n_variables

我查看了Introductory vignette,,但似乎并不是一个明确的方法。

理想情况下,我正在寻找一种不会强迫我命名参数的解决方案(即我不必像#define the class (only has a constructor that accepts a vector of names) myClass <- R6Class("myClass", public = list( names = NA, initialize = function(names) { if (!missing(names)) self$names <- names }) ) #create a test object using a vector of names variable_names = c("x","y") a = myClass$new(variable_names) a$names #> [1] "x y" #everything after here does not actually work (just to illustrate functionality) n_variables = 2; b = myClass$new(n_variables) b$names #> [1] "v1 v2" 这样做),这样我就可以轻松检查输入是否有效。< / p>

1 个答案:

答案 0 :(得分:4)

可能的方法是使用构造函数的dot-dot-dot(省略号)参数,它允许您将任意数量的参数传递给函数。之后,您必须将“...”转换为列表并解析输入参数。

例如假设我们想要通过arity重载构造函数。

myClass <- R6Class("myClass",
   public = list(
      name = NA,
      age = NA,
      favouriteFood = NA,
      # Constructor overloaded by arity
      initialize = function(...) {
         arguments <- list(...)
         switch(nargs(),
            # one input argument
            {self$name <- arguments[[1]]},
            # two input arguments
            {self$name <- arguments[[1]]
            self$age <- arguments[[2]]},
            # three input arguments
            {self$name <- arguments[[1]]
            self$age <- arguments[[2]]
            self$favouriteFood <- arguments[[3]]}
         )
         print(self)
      })
)

现在调用构造函数给我们

> a = myClass$new("john")
<myClass>
  Public:
    age: NA
    clone: function (deep = FALSE) 
    favouriteFood: NA
    initialize: function (...) 
    name: john
> a = myClass$new("john",35)
<myClass>
  Public:
    age: 35
    clone: function (deep = FALSE) 
    favouriteFood: NA
    initialize: function (...) 
    name: john
> a = myClass$new("john",35,"pasta")
<myClass>
  Public:
    age: 35
    clone: function (deep = FALSE) 
    favouriteFood: pasta
    initialize: function (...) 
    name: john