0

我是 R6 和面向对象编程的新手,所以我不确定谈论对象内部字段之间依赖关系的正确方法。

我的对象具有依赖于对象内其他字段的字段。我希望这些依赖字段在更新其中一个输入时自动更新。

我已经想出了一种手动方法,但认为可能有更好的方法。我在田野里玩耍,active但我无法让它们工作。

这个例子应该很清楚。我有一个quad接受widthheight计算的对象area。我希望area在更新时自动width更新height

这似乎是活动领域旨在实现的目标之一,但我无法让它们发挥作用。

self$area出于说明的目的,我通过在每个字段的set方法中包含一个重新计算行来实现我的目标。

这应该怎么做?

library(R6)
quad <- R6Class("quad", public =
                list(width = NULL,
                     height = NULL,
                     area = NULL,
                     initialize = function(width, height) {
                         self$width <- width
                         self$height <- height
                         self$area = self$width * self$height
                         self$greet()
                     },
                     set_width = function(W) {
                         self$width <- W
                         self$area = self$width * self$height #hack
                     }, 
                     set_height = function(H) {
                         self$height <- H
                         self$area = self$width * self$height #hack
                     }, 
                     greet = function() {
                         cat(paste0("your quad has area: ", self$area, ".\n"))
                     })
                )
#
> quad1 <- quad$new(5, 5)
your quad has area: 25.

> quad1$set_height(10)
> quad1$area
[1] 50    
4

1 回答 1

1

活动绑定本质上是一个无需使用即可调用的函数(),因此它看起来像一个常规字段。

在下面的示例中,area是一个活动绑定,每次访问它时都会计算。

library(R6)
Quad <- R6Class(
  "Quad",
  public = list(
    initialize = function(width, height) {
      self$width <- width
      self$height <- height
    },
    width = NULL,
    height = NULL
  ),
  active = list(
    area = function() {
      self$width * self$height
    }
  )
)


q <- Quad$new(8, 3)
q$area
#> [1] 24

q$height <- 5
q$area
#> [1] 40
于 2019-02-22T02:20:02.080 回答