2016-11-18 3 views
0

は、私は次のように定義されたクラスがあるとしましょう:S4オブジェクトの空きスロットを許可しないようにするにはどうすればよいですか?

setClass("myclass", slots = list(id="character")) 

私は物事はidが必須であるとidのないmyclassが無効なオブジェクトであるようなものにしたいです。

> new("myclass") 
An object of class "myclass" 
Slot "id": 
character(0) 

は、私が検証機能を設定することが役立つと期待:

setValidity("myclass", function(object){ 
    if(length(slot(object, "id")) == 0L){ 
    return("You cannot do that") 
    } 
    return(TRUE) 
}) 

> new("myclass") 
An object of class "myclass" 
Slot "id": 
character(0) 

をしかし残念ながら、それは検証機能がバイパスされるようになり、空の引数を持つように思える現在では、私は次の取得します。このタイプの入力を無効にする方法はありますか?私は見つけることができる最善の解決策は、(私には少しひねくれたらしい)コンストラクタ関数で検証ステップを入れていた

答えて

0

setMethod("initialize", "myclass", function(.Object, id){ 
    if(missing(id)) stop("The id is not allowed to be empty") 
    [email protected] <- id 
    validObject(.Object) 
    return(.Object) 
}) 

これは今、期待される結果が得られます。

> new("myclass") 
Error in .local(.Object, ...) : The id is not allowed to be empty 
> new("myclass", id = character()) 
Error in validObject(.Object) : 
    invalid class “myclass” object: You cannot do that 
> new("myclass", id = "a") 
An object of class "myclass" 
Slot "id": 
[1] "a" 
関連する問題