我试图找出提供功能用户界面来引用类(或实际上是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))
我试图弄清楚这是否因为我的例子在病理上很简单,但我仍然想知道编写引用类是否有任何意义,然后将它们包装在功能接口中,而不是编写纯函数代码。
任何详细的例子都会有很大帮助。
答案 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