作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个项目,需要构建 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/
我是一名优秀的程序员,十分优秀!