可以在 R6 对象中使用辅助函数吗?
Can you use helper functions inside R6 objects?
我试图避免在 R6 对象中重复。每次更新其中一个输入时,必须更新 calculated/derived 个值。
下面的 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)
}
)
)
您需要告诉您的 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
我试图避免在 R6 对象中重复。每次更新其中一个输入时,必须更新 calculated/derived 个值。
下面的 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)
}
)
)
您需要告诉您的 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