可以在 R6 对象中使用辅助函数吗?

Can you use helper functions inside R6 objects?

我试图避免在 R6 对象中重复。每次更新其中一个输入时,必须更新 calculated/derived 个值。

下面的 Cube 对象演示了这个问题。如果我更新 widthheightdepth 中的任何一个,则必须更新 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)
    }
  )
)

您需要告诉您的 class 在哪里可以找到 volCalc。它会在 self 中找到它。因此,您需要做的就是将对 volCalc 的内部调用设为 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