Можете ли вы использовать вспомогательные функции внутри объектов R6? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь избежать повторения внутри объекта 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)
    }
  )
)

1 Ответ

2 голосов
/ 17 февраля 2020

Вы должны сказать своему классу, где найти volCalc. Он найдет его в self. Поэтому все, что вам нужно сделать, это сделать внутренние звонки на volCalc be self$volCalc. Тогда вы можете сделать это:

cc <- Cube$new(width = 5, height = 6, depth = 7)
cc
#> <Cube>
#>   Public:
#>     clone: function (deep = FALSE) 
#>     depth: 7
#>     height: 6
#>     initialize: function (width, height, depth) 
#>     set_depth: function (nDepth) 
#>     set_height: function (nHeight) 
#>     set_width: function (nWidth) 
#>     volCalc: function (W, H, D) 
#>     volume: 210
#>     width: 5

cc$set_width(10)
cc
#> <Cube>
#>   Public:
#>     clone: function (deep = FALSE) 
#>     depth: 7
#>     height: 6
#>     initialize: function (width, height, depth) 
#>     set_depth: function (nDepth) 
#>     set_height: function (nHeight) 
#>     set_width: function (nWidth) 
#>     volCalc: function (W, H, D) 
#>     volume: 420
#>     width: 10
...