R - R6类作为严格的“只读”数据结构

时间:2018-05-07 21:11:05

标签: r r6

在大型项目中,我有时希望拥有一个标准化且严格的数据“对象”,这样该数据的任何函数都可以自信地假设该对象的众多属性,而不仅仅是该对象属于预期类的断言。所以我很高兴能够发现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函数是一个hack。我真正想要的是data的属性可以简单地作为data$xdata[['x']]访问,同时仍然具有私有变量的防篡改质量。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我将简要总结一下what I learned herebase::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

由于xy被锁定,data$x = 5会根据需要抛出错误。