Я пытаюсь избежать повторения внутри объекта R6. Есть вычисленные / производные значения, которые должны обновляться каждый раз, когда обновляется один из входных данных.
Объект Cube
ниже демонстрирует проблему. Если я обновлю какой-либо из width
, height
или depth
, значит, volume
должен быть обновлен.
В этом случае формула тривиальна, но в реальных случаях это не всегда так. Можно хранить сведения о volCalc
где-нибудь и позволить set_width
использовать эту функцию для обновления volume
при их обновлении?
Прямо сейчас я могу создать объект, используя объект код ниже:
R> cc <- Cube$new(width = 5, height = 6, depth = 7)
но он ломается при обновлении
R> cc$set_width(10)
Error in volCalc(self$width, self$height, self$depth) :
could not find function "volCalc"
Как вы можете видеть, я вкладываю знания о том, как рассчитать объем куба (volCalc
) в два места; но увы cc$set_width
и друзья не могут его найти ...
Cube <- R6Class("Cube",
public = list(
width = NULL,
height = NULL,
depth = NULL,
volume = NULL,
initialize = function(width, height, depth) {
self$width <- width
self$height <- height
self$depth <- depth
volCalc = function(W, H, D) W * H * D
self$volume <- volCalc(width, height, depth)
},
volCalc = function(W, H, D) {
self$volume <- W * H * D
invisible(self)
},
set_width = function(nWidth) {
self$width <- nWidth
volCalc(self$width, self$height, self$depth)
invisible(self)
},
set_height = function(nHeight) {
self$height <- nHeight
volCalc(self$height, self$height, self$depth)
invisible(self)
},
set_depth = function(nDepth) {
self$depth <- nDepth
volCalc(self$depth, self$depth, self$depth)
invisible(self)
}
)
)