3

私はここの初心者です。S4 クラスを使用しようとしています。私の設定方法のいくつかでは、入力値を取り、それが有効かどうかをテストしたいと思います。有効であれば、割り当てたいと思います。有効でない場合は、テストできる警告を生成したいと思います。以下に簡単な例を示します。

 setClass("foo", representation(ind = "numeric"))

 setGeneric(name="setInd<-",def=function(object,value){standardGeneric("setInd<-")})

 setReplaceMethod(f="setInd",signature="foo",
 def=function(object,value){
   if(is.numeric(value)){
     object@ind<-value;}
   else{
     warning("Foobar")
   }
    return(object)}
 )

これにより、文字を割り当てようとすると警告メッセージが生成されます。

> thisFoo<-new("foo", ind = 2)
> thisFoo
An object of class "foo"
Slot "ind":
[1] 2


> setInd(thisFoo)<-"A"
Warning message:
In `setInd<-`(`*tmp*`, value = "A") : Foobar
> thisFoo
An object of class "foo"
Slot "ind":
[1] 2

しかし、割り当てが失敗したことをテストできるようにしたいと思います。これを行う良い方法は何ですか?ありがとう。

4

1 に答える 1

2

割り当てが失敗した場合は、警告ではなくエラーを返します。プロセスが完了したことを示す警告が表示されますが、予期しない結果が生じる可能性があります。あなたの場合、プロセスは中止されます:

setReplaceMethod(f="setInd",signature="foo",
 def=function(object,value){
   if(!is.numeric(value))
     stop("Foobar")

   object@ind <- value  
   return(object)}
 )

using を使用stopすると、使用tryCatch()またはtry()構築できます。詳細については、関連するヘルプ ページを参照してください。例:

tryCatch(setInd(thisFoo)<-"A",error=function(e){print("Hello")})

> X <- try(setInd(thisFoo) <- "A")
Error in `setInd<-`(`*tmp*`, value = "A") : Foobar
> if(is(X,"try-error")) setInd(thisFoo) <- 5
> thisFoo
An object of class "foo"
Slot "ind":
[1] 5

本当に警告を処理する必要がある場合は、 を参照してwithCallingHandlersください。元のコードを使用する:

> withCallingHandlers({setInd(thisFoo)<-"A"},
+     warning = function(w) {print("Hello")})
[1] "Hello"
Warning message:
In `setInd<-`(`*tmp*`, value = "A") : Foobar

これは、エラーを使用する上記のオプションよりも使用が簡単ではないことに注意してください。

于 2011-03-24T01:16:03.363 に答える