我正在尝试设置params
字段并在Template类中对其进行验证,因此我可以执行TemplateClass$new(params)
并自动验证,但是我收到错误:
Template <- setRefClass('Template',
fields = c(
"params"
),
methods = list(
initialize = function(params){
params <<- params
validate_params()
},
validate_params = function(){
"everything okay"
}
)
)
PointsTemplate <- setRefClass('PointsTemplate',
contains = "Template",
methods = list(
initialize = function(params){
callSuper(params)
}
)
)
Error in .Object$initialize(...) :
argument "params" is missing, with no default
编辑:我似乎已通过将initialize
课程中的Template
方法更改为initialize = function(params = NULL){}
来解决此问题。但我不明白为什么需要这样做。
另外,我看到其他人在类不包含任何超类时使用callSuper()
。这是什么原因?
答案 0 :(得分:3)
我对R参考课程没有任何经验,但使用?ReferenceClasses
的帮助,您可以阅读以下内容:
初始化方法在设计时需要注意,如 他们为S4课程做。因此,您的方法通常应包括......作为 参数,所有其他参数应该有默认值或检查 缺失,你的方法应该通过所有初始值 $ callSuper()或$ initFields()如果你知道你的超类有 没有初始化方法。
所以我通过在父类中使用...设置我的初始化函数来理解这一点,并使用默认值为所有字段命名参数。
Template <- setRefClass('Template',
fields = list(params="list"),
methods = list(initialize =
function(...,params=list(1:5)){
callSuper(...,params=params)
validate_params()
},
validate_params = function(){
"everything okay"
}
)
)
对于子类,不需要初始化参数,因为我确信超类会点对它。
PointsTemplate <- setRefClass('PointsTemplate',
contains = "Template",
methods = list(initialize =
function(...){
callSuper(...)
}
))
没有测试初始化:
## using default values
> PointsTemplate$new()
Reference class object of class "PointsTemplate"
Field "params":
[[1]]
[1] 1 2 3 4 5
## setting params
PointsTemplate$new(params=list(1:10))
Reference class object of class "PointsTemplate"
Field "params":
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10