参考类的功能接口

时间:2013-12-18 05:00:02

标签: r oop s4 reference-class r-s3

我试图找出提供功能用户界面来引用类(或实际上是S4 / S3类)的概念含义。简而言之,我担心如果我编写如下所示的代码,那么它相当于编写功能代码。

这是一个简单的线性回归类:

linRegClass = setRefClass('linRegClass',
                          fields = list(formulaReg = 'formula',
                                        dataReg = 'data.frame'),
                          methods = list(doReg = function() {
                            lm(.self$formulaReg, data = .self$dataReg)
                          }))

linRegInstance = linRegClass$new(dataReg = cars, 
                    formulaReg = as.formula(speed ~ dist))
linRegInstance$doReg()
class(linRegInstance)

面向对象的界面不是非常用户友好,因此在Martin Morgan's slides中,我将为底层引用类编写一个功能用户界面:

fnLinReg = function(formulaReg, dataReg) {
  linRegInstance = linRegClass$new(formulaReg = formulaReg, 
                                   dataReg = dataReg)
  linRegInstance$doReg()
}

## use the functional interface
fnLinReg(dataReg = cars, formulaReg = as.formula(speed ~ dist))

现在这个功能界面在观察上等同于纯函数

fnLinReg2 = function(formulaReg, dataReg) {
  lm(formula = formulaReg, data = dataReg)
}

## use the pure function
fnLinReg2(dataReg = cars, formulaReg = as.formula(speed ~ dist))

我试图弄清楚这是否因为我的例子在病理上很简单,但我仍然想知道编写引用类是否有任何意义,然后将它们包装在功能接口中,而不是编写纯函数代码。

任何详细的例子都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

可以使用initialize方法定义复杂的构造函数,当您调用new时,将自动调用该方法。我已修改您的示例以包含initialize方法,以及用于存储回归结果的新字段,因为initialize将始终返回referenceClass

linRegClass = setRefClass('linRegClass',
                          fields = list(formulaReg = 'formula',
                                        dataReg = 'data.frame',
                                        result = 'lm'),
                          methods = list(doReg = function() {
                            lm(.self$formulaReg, data = .self$dataReg)
                          },
                          initialize = function(formulaReg, dataReg, ...) {
                            formulaReg <<- formulaReg
                            dataReg <<- dataReg
                            result <<- .self$doReg()
                          }))

所以现在我们只需要:

linRegInstance <- linRegClass$new(dataReg = cars, 
                                    formulaReg = as.formula(speed ~ dist))
linRegInstance$result