Я пытаюсь понять концептуальные последствия предоставления функционального пользовательского интерфейса для ссылочных классов (или действительно классов 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))
Я пытаюсь выяснить, является ли это потому, что мой пример патологически прост, но мне все еще интересно, есть ли какая-нибудь точка в написании ссылочных классов, а затем обертывание их в функциональные интерфейсы против написания чисто функционального кода.
Любые подробные примеры очень помогли бы.
Ваш пример очень смущен. Любой тип OO плохо для этого примера: вы не сохраняете класс и позже используете его методы, вам просто нужен вызов 'lm', поэтому, конечно, чистая функция будет лучше. –