2

假设我想创建一个带有两个插槽 A 和 B 的类“myClass”。

现在我想要一个validObject函数来确保A和B的长度相同

same_length <- function(object){
    if(length(object@A)!=length(object@B)) {
        "vectors are not the same length"
     } else TRUE
}

setClass("myClass", representation(A="numeric", B="numeric"),
          validity=same_length)

我在某处看到了一个函数,可以确保类在初始化时有效:

setMethod("initialize", "myClass", function(.Object, ...){
    value <- callNextMethod()
    validObject(value)
    value
})

如果我尝试会发送错误

newObj <- new("myClass", A=c(1,2,3), B=c(1,2))

但如果我这样做

newObj <- new("myClass")
newObj@A <- c(1,2,3)
newObj@B <- c(1,2)

没有错误被抛出。一旦新的插槽分配未验证,我如何让它抛出错误?

4

1 回答 1

0

编写一个进行检查的“替换方法”。为此,我们需要创建一个通用函数(因为不存在具有适当名称和签名的函数)

setGeneric("slotA<-", function(x, ..., value) standardGeneric("slotA<-"))

然后,我们需要为我们想要处理的特定类型的对象实现替换方法——第一个参数属于“myClass”类,第二个参数 ( value) 属于“numeric”类:

setReplaceMethod("slotA", c("myClass", "numeric"), function(x, ..., value) {
    x@A = value
    validObject(x)
    x
})

我们还可以编写一个“getter”泛型和方法

setGeneric("slotA", function(x, ...) standardGeneric("slotA"))
setMethod("slotA", "myClass", function(x, ...) x@A)

进而

> a=new("myClass", A=1:10, B=10:1)
> slotA(a)
 [1]  1  2  3  4  5  6  7  8  9 10
> slotA(a) = 1:5
Error in validObject(x) : 
  invalid class "myClass" object: vectors are not the same length

请注意,默认initialize方法调用checkValidity,因此如果您将callNextMethod其用作构造函数的最后一行,则无需显式检查有效性。

于 2012-06-21T16:05:55.083 回答