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

标签 r r6

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

作为一个激励性的例子:我想要一个 R6 类 MyClass 的两个构造函数,其中一个字段 names 可以使用向量 variable_names 进行初始化 或整数n_variables(在这种情况下,它初始化默认的名称向量)。

该功能应该像这样工作:

#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"

我浏览了一下Introductory vignette,但似乎没有明确的方法来做到这一点。

理想情况下,我正在寻找一种不会强制我命名参数的解决方案(即,我不必执行类似 myClass$new(names=variable_names) 的操作),这样就可以我可以轻松检查输入是否有效。

最佳答案

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

<小时/>

例如,假设我们想按数量重载构造函数。

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

关于R:如何为R6类定义多个构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35025953/

相关文章:

R - R6 类作为严格的 "read-only"数据结构

r - RStudio中的代码折叠:在代码中创建层次结构

r - 在 R 中将样本与 fiddle 图配对

r - 如何在 R 中最好地结合独特和匹配?

r - 选择行,根据行创建单独的数据集

r - 如何调用R6父类中的函数,其中父函数依赖于其他重写的辅助函数

r - 用 R 求解欠定线性系统

r - 如何在 R 中将 `foreach` 和 `%dopar%` 与 `R6` 类一起使用?

R并行: rbind parallely into separate data.帧

r - R6 类的 S4 调度行为不一致