Обработка ошибок с классами S4 - PullRequest
3 голосов
/ 24 марта 2011

Я новичок здесь.Я пытаюсь использовать классы 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

Но я хотел бы иметь возможность проверить, что назначение не удалось,Каков хороший способ сделать это?Спасибо.

1 Ответ

2 голосов
/ 24 марта 2011

Если назначение не выполнено, я бы вместо сообщения вернул ошибку.Предупреждение говорит вам, что процесс прошел, но может дать неожиданный результат.В вашем случае процесс прерывается:

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

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

с помощью 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

Имейте в виду, это менее просто для использования, чем вышеупомянутые варианты с ошибками.

...