在S4中,我可能会这样做:
setClass(
"test", slots=c(a="integer"),
validity=function(object) if(length(object@a) != 1L) "not scalar" else TRUE
)
参考类的等价物是什么?我在参考类的上下文中找不到对有效性函数的任何引用。我必须依赖于定义setter类吗?虽然基于引用类docs中的此注释:
许多使用OOP编程范例的系统建议或实施与每个字段对应的getter和setter方法,而不是按名称直接访问。如果您喜欢这种样式并希望通过x $ getAbc()提取名为abc的字段并通过x $ setAbc(value)分配它,则$ accessors方法是一个便利函数,它为指定字段创建此类getter和setter方法。 否则没有理由使用此机制。
似乎应该有另一种方式。
答案 0 :(得分:2)
可以在参考类
上设置有效性方法.A <- setRefClass("A", fields=list(x="numeric"))
setValidity("A", function(object) {
if (length(object$x) != 1)
"'x' must be length 1"
else TRUE
})
但是在可能有用的所有情况下都没有调用
> .A()
Reference class object of class "A"
Field "x":
numeric(0)
> .A(x=1:5)
Reference class object of class "A"
Field "x":
[1] 1 2 3 4 5
> validObject(.A(x=1:5))
Error in validObject(.A(x = 1:5)) :
invalid class "A" object: 'x' must be length 1
在某些方面,这与S4没有什么不同/不那么古怪
.B <- setClass("B", representation(x="numeric"))
setValidity("B", function(object) {
if (length(object@x) != 1)
"'x' must be length 1"
else TRUE
})
与
> .B() # no validity checking!
An object of class "B"
Slot "x":
numeric(0)
> validObject(.B())
Error in validObject(.B()) :
invalid class "B" object: 'x' must be length 1
> .B(x=1:5)
Error in validObject(.Object) :
invalid class "B" object: 'x' must be length 1
> b = .B(x=1L)
> b@x <- 1:5 # no validity checking@!
> validObject(b)
Error in validObject(b) : invalid class "B" object: 'x' must be length 1