R - класс R6 как жесткая структура данных «только для чтения» - PullRequest
0 голосов
/ 08 мая 2018

В больших проектах мне иногда хочется иметь стандартизированный и жесткий «объект» данных, чтобы любая функция этих данных могла уверенно принимать многочисленные свойства объекта, не более чем утверждая, что объект принадлежит ожидаемому классу. Поэтому я очень рад, что открыл классы R6, которые, кажется, позволяют это, предоставляя «частные» элементы следующим образом:

library('R6')
Data = R6::R6Class("Data", 
    private = list(x = NA, y = pi),
    public = list(
        initialize = function(x, y) {
            private$x = x
        },
        get = function(attribute) return(private[[attribute]])
    )
)

data = Data$new(x = 5)
data$get('x')
data$get('y')

Эта get функция взломана. Что я действительно хочу, так это чтобы атрибуты data были доступны просто как data$x или data[['x']], при этом сохраняя защищенные свойства от частных переменных. Есть ли лучший способ добиться этого?

1 Ответ

0 голосов
/ 08 мая 2018

Я кратко обобщу то, что я узнал здесь . Функция base::lockBinding применима здесь, потому что класс R6 по сути является средой:

library('R6')
Data = R6::R6Class("Data", 
    public = list(
        x = NA,
        y = pi,
        initialize = function(x) {
            self$x = x
            lockBinding("x", self)
            lockBinding("y", self)
        }
    )
)

data = Data$new(x = 5)
data$x
data$y

Поскольку x и y заблокированы, data$x = 5 выдает ошибку по желанию.

...