2017-06-08 6 views
1

私のクラス 'class2'の妥当性を検証する問題があります。それは 'class1'オブジェクトのリストで作られています。R他のS4クラスのリストを含むS4クラス

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

私は問題がテストすることによって、lapplyから来ていたことを確認:

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受け入れられていない値を返すことです:私は、それは確かにそうであることを確認したいです正常に動作しているリストの最初の要素は、:

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

関連する問題