2013-06-25 41 views
3

我試圖設置params領域和模板類驗證它,所以我可以做TemplateClass$new(params),它會自動驗證,但我得到一個錯誤:如何使用引用類在R中的父類中設置字段?

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()時,類不包含任何超類。這是什麼原因?

+1

FYI每個類都有一個超類。如果沒有明確指定它是基礎「envRefClass」。 – hadley

回答

3

我沒有與R參考類的任何經驗,但使用的?ReferenceClasses幫助下,你可以閱讀以下內容:

Initialization methods need some care in design, as they do for S4 classes. Therefore, your method should normally include ... as an argument, all other arguments should have defaults or check for missingness, and your method should pass all initialized values on via $callSuper() or $initFields() if you know that your superclasses have no initialization methods.

所以我用我的設置初始化函數在父類明白這一點..併爲具有默認值的所有字段命名參數。

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 
+0

很好的例子。爲什麼根據'validate_params'函數''沒有任何信息'? –

+0

@DanielKrizian也許我應該加上'message(「一切正常」)' – agstudy

相關問題