3

我正在尝试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方法更改为. 但我不明白为什么需要这样做。Templateinitialize = function(params = NULL){}

另外,我看到其他人callSuper()在该类不包含任何超类时使用。这是什么原因?

4

1 回答 1

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
于 2013-06-25T23:01:10.677 回答