如何使用引用类在R中的父类中设置字段?

时间:2013-06-25 21:59:38

标签: r reference-class

我正在尝试设置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()。这是什么原因?

1 个答案:

答案 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