Pergunta

Sou um novato aqui.Estou tentando usar classes S4.Em alguns dos meus métodos de configuração, gostaria de pegar um valor de entrada e testar se ele é válido.Se for válido, gostaria de atribuí-lo.Se não for válido, gostaria de gerar um aviso que pode ser testado.Aqui está um exemplo simples:

 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)}
 )

Isso gera uma mensagem de aviso quando tento atribuir um caractere:

> 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

Mas gostaria de poder testar se a atribuição falhou.Qual é uma boa maneira de fazer isso?Obrigado.

Foi útil?

Solução

Se a atribuição falhar, eu retornarei um erro em vez de um aviso.Um aviso informa que o processo foi concluído, mas pode dar um resultado inesperado.No seu caso, o processo foi abortado:

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

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

usar stop permite que você use tryCatch() ou construções try().Consulte as páginas de ajuda relevantes para obter mais informações.Ex:

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

Se você realmente precisa trabalhar com avisos, dê uma olhada em withCallingHandlers.Usando seu código original:

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

Veja, isso é menos simples de usar do que as opções mencionadas acima usando erros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top