Я новичок в 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