在大型项目中,我有时希望拥有一个标准化且严格的数据“对象”,这样该数据的任何函数都可以自信地假设该对象的众多属性,而不仅仅是该对象属于预期类的断言。所以我很高兴能够发现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$x
或data[['x']]
访问,同时仍然具有私有变量的防篡改质量。有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
我将简要总结一下what I learned here。 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
会根据需要抛出错误。