假设我想创建一个带有两个插槽A和B的“myClass”类。
现在我想要一个确保A和B长度相同的validObject函数
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&lt; - 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)
不会抛出任何错误。如果新的插槽分配未验证,如何让它抛出错误?
答案 0 :(得分: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
作为构造函数中的最后一行,则无需明确检查有效性。