Обновление зависимого поля в объекте R6 при обновлении родительского поля - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в R6 и объектно-ориентированном программировании, поэтому я не уверен, что правильно говорить о зависимостях между полями внутри объекта.

Мои объекты имеют поля, которые зависят от других полей внутри объекта.Я хотел бы, чтобы эти зависимые поля автоматически обновлялись при обновлении одного из входных данных.

Я нашел ручной способ сделать это, но подумал, что может быть лучший способ.Я играл с active полями, но я не мог заставить их работать.

Этот пример должен прояснить ситуацию.У меня есть объект quad, который принимает width и height и вычисляет 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    

1 Ответ

0 голосов
/ 22 февраля 2019

Активная привязка - это, по сути, функция, которая вызывается без необходимости использования (), поэтому она выглядит как обычное поле.

В приведенном ниже примере 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
...