我试图弄清楚为引用类(或实际上是 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 的幻灯片中,我会为底层的引用类写一个功能性的用户界面:
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))
我试图弄清楚这是否是因为我的示例在病态上很简单,但我仍然想知道编写引用类然后将它们包装在函数式接口中而不是编写纯函数式代码是否有任何意义。
任何详细的例子都会有很大帮助。