2017-06-08 160 views
1

我有一個問題來驗證我的類'class2'的有效性;它由'class1'對象列表組成。我想,以驗證它確實是這樣的:R S4類包含另一個S4類的列表

class2 <- setClass(

    Class = "class2", 

    slots = c(slotListName = "list"), 

    validity = function(object){ 

      lapply([email protected], function(x){ 

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

的問題是,lapply返回這是不能接受的值:

Error in validObject(.Object) : 
invalid class 「class2」 object: 1: NULL 
invalid class 「class2」 object: 2: NULL 

我檢查這個問題從lapply僅測試來列表中的第一個元素,這是工作的罰款:

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

我試圖向量化,但是這並不能改變問題。

有沒有辦法來驗證slotListName確實是'class1'對象的列表?

非常感謝!

+0

如果沒有class1對象,你希望發生什麼? 'slotListName'應該是NULL還是長度爲0的列表? –

+0

我想要構造函數拋出一個錯誤,並且不要創建類2對象。謝謝! – nicoluca

回答

0

你的函數的問題是它給一個無效的對象提供了一個錯誤。它應該返回一個診斷信息,S4對象工程機械負責處理錯誤。

下面介紹如何使用推薦的方法進行此操作,該方法用於定義initializesetValidity的方法。有關更多詳細信息,請參見?setClass

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

setMethod("initialize", "class2", function(.Object, lst) 
{ 
    [email protected] <- lst 
    validObject(.Object) 
    .Object 
}) 

# returns TRUE if the object is valid, otherwise a diagnostic message 
setValidity("class2", function(object) 
{ 
    if(length([email protected]) < 1) 
     "must contain at least one class1 object" 
    else if(!all(sapply([email protected], 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()) 
+0

明白了!非常感謝你。 – nicoluca