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 对象构造机械处理错误。
以下是使用推荐方法实现的方法,即为 initialize
和 setValidity
定义方法。有关详细信息,请参阅 ?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())
我在验证 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 对象构造机械处理错误。
以下是使用推荐方法实现的方法,即为 initialize
和 setValidity
定义方法。有关详细信息,请参阅 ?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())