参考类的有效性方法

时间:2015-05-26 02:31:06

标签: r oop

在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方法。 否则没有理由使用此机制

似乎应该有另一种方式。

1 个答案:

答案 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