Если назначение не выполнено, я бы вместо сообщения вернул ошибку.Предупреждение говорит вам, что процесс прошел, но может дать неожиданный результат.В вашем случае процесс прерывается:
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
Имейте в виду, это менее просто для использования, чем вышеупомянутые варианты с ошибками.