在S4中,我可能会这样做:
setClass(
"test", slots=c(a="integer"),
validity=function(object) if(length(object@a) != 1L) "not scalar" else TRUE
)引用类的等效性是什么?在引用类的上下文中,我找不到对有效性函数的任何引用。我必须依赖定义setter类吗?尽管基于引用类文档中的这个注释:
许多使用OOP编程范例的系统推荐或实施与每个字段对应的getter和setter方法,而不是按名称直接访问。如果您喜欢这种样式,并且希望提取一个名为abc $getAbc()的字段,并按x$setAbc(value)分配它,那么$accessors方法是一个方便的函数,它为指定的字段创建这样的getter和setter方法。,否则就没有理由使用这种机制了,。
看来应该有别的办法。
发布于 2015-05-26 17:04:14
可以在引用类上设置有效性方法
.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 1https://stackoverflow.com/questions/30448518
复制相似问题