【问题标题】:Update a dependent field in R6 object when a parent field is updated更新父字段时更新 R6 对象中的依赖字段
【发布时间】:2019-02-20 12:15:17
【问题描述】:

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

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

我想出了一种手动的方法,但认为可能有更好的方法。我玩弄了active 字段,但我无法让它们工作。

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

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

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

这应该怎么做?

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    

【问题讨论】:

    标签: r oop r6


    【解决方案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
    

    【讨论】:

    • 谢谢@wch。问题的要点实际上是最好的方法/应该如何完成。我想将area 设为活动字段可能会很昂贵,因为每次调用q$area 时都会重新进行计算,即使heightwidth 没有变化?
    • 这取决于你在做什么。在 R 中调用函数的成本非常小,所以对于大多数事情我不会担心。如果您访问area 的次数远多于height/width,那么您可以将area 设为正常值并将heightwidth 设置为area 的值的活动绑定。如果性能确实是一个问题,我建议进行基准测试(使用 microbenchmark 或 bench)并分析您的代码(使用 profvis)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多