R S4class 包含另一个 S4class 的列表

R S4class containing list of another S4class

我在验证 class 'class2' 的有效性时遇到问题;它由 'class1' 个对象的列表组成。我想验证一下是否确实如此:

class2 <- setClass(

    Class = "class2",

    slots = c(slotListName = "list"),

    validity = function(object){

             lapply(object@slotListName, function(x){

            if(!identical(is(x), "class1"))
                stop(" not a class1 object");
        });            
    });

问题是 lapply returns 不被接受的值:

Error in validObject(.Object) : 
invalid class “class2” object: 1: NULL
invalid class “class2” object: 2: NULL

我通过仅测试列表的第一个元素来检查问题是否来自 lapply,它工作正常:

if(!identical(is(object@slotListName[[1]]), "class1"))
       stop("not a class1 object");

我试过向量化,但这并没有改变问题。

有没有办法验证 slotListName 确实是 'class1' 个对象的列表?

非常感谢!

你的函数的问题是它给出了无效对象的错误。它应该 return 一条诊断消息,由 S4 对象构造机械处理错误。

以下是使用推荐方法实现的方法,即为 initializesetValidity 定义方法。有关详细信息,请参阅 ?setClass

class2 <- setClass("class2", slots=c(slotListName="list"))

setMethod("initialize", "class2", function(.Object, lst)
{
    .Object@slotListName <- lst
    validObject(.Object)
    .Object
})

# returns TRUE if the object is valid, otherwise a diagnostic message
setValidity("class2", function(object)
{
    if(length(object@slotListName) < 1)
        "must contain at least one class1 object"
    else if(!all(sapply(object@slotListName, function(x) inherits(x, "class1"))))
        "all objects in list must be class1"
    else TRUE
})


## testing
x <- 42
class(x) <- "class1"
y <- 43
class(y) <- "bad"

l1 <- list(x, x, x)
l2 <- list(x, x, y)


## works
obj1 <- class2(l1)

## error: bad object in list
obj2 <- class2(l2)

## error: empty list
obj3 <- class2(list())