【问题标题】:R - R6 class as a rigid "read-only" data structureR - R6 类作为刚性“只读”数据结构
【发布时间】:2018-05-07 21:11:05
【问题描述】:

在大型项目中,有时我希望拥有一个标准化且严格的数据“对象”,以便该数据的任何功能都可以自信地假设对象的许多属性,而只是断言该对象属于预期的类。所以我很高兴发现了 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']] 一样简单地访问,同时仍然具有私有变量的防篡改特性。有没有更好的方法来实现这一目标?

【问题讨论】:

标签: r r6


【解决方案1】:

我将简要总结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 会根据需要引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2021-05-22
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多