【问题标题】:How to set a field in the parent class in R using reference classes?如何使用引用类在 R 中的父类中设置字段?
【发布时间】:2013-06-25 21:59:38
【问题描述】:

我正在尝试设置 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

编辑:我似乎已经通过将Template 类中的initialize 方法更改为initialize = function(params = NULL){} 来解决它。但我不明白为什么需要这样做。

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

【问题讨论】:

  • 仅供参考,每个班级都有一个超级班级。如果未明确指定,则为基础“envRefClass”。

标签: r reference-class


【解决方案1】:

我对 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

【讨论】:

  • 很好的例子。为什么"everything okay"按照validate_params函数没有消息?
  • @DanielKrizian 也许我应该添加`消息(“一切都好”)`
猜你喜欢
  • 1970-01-01
  • 2019-02-05
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2019-05-30
相关资源
最近更新 更多