On 2010-12-06, at 01:07 , David Winsemius wrote:

> 
> On Dec 5, 2010, at 3:13 PM, Marius Hofert wrote:
> 
>> Dear expeRts,
>> 
>> I am struggling with warning/error handling.
>> 
>> I would like to call a function which can produce either
>> a) normal output
>> b) a warning
>> c) an error
>> 
>> Since the function is called several (thousand) times in a loop, I would like
>> to proceed "quietly" and collect the warnings and errors [to deal with them 
>> at a
>> later point].
> 
> I do not see the function warnings() being used below:
> 
> ?warnings
> 
> It delivers the stored warnings with different default behavior for 
> interactive and non-interactive sessions.
>> 
>> I have seen constructs with tryCatch (which can deal with errors) and with
>> withCallingHandlers (which can deal with warnings), but I cannot figure out 
>> how
>> to catch *both* warnings and errors. Below is a minimal example of the 
>> function
>> that is called several times in a large loop. The function should catch 
>> warnings
>> and errors; the former work fine, but with the latter I do not know how to 
>> proceed.
>> 
> 
> 
> Made some changes in you code but don't know if it is what you were hoping 
> for:
> 
> f <- function(x){
>   ## warnings
>   w.list <- NULL # init warning
>   w.handler <- function(w){ # warning handler
>           warn <- simpleWarning(w$message, w$call) # build warning
> # first change here
>       w.list <<- c(w.list, paste(warnings(), collapse = " ")) # save warning
>       invokeRestart("muffleWarning")
>       }
>   ## errors
>     e.list <- NULL # init errors   # not sure this is  good idea
>     e.handler <- function(e){ # error handler
>            err <- c(e.list, e$message, e$call) # save error
>            return( err)
>        }
>   ## execute command
> # wrapped cal in try()
>   res <- withCallingHandlers(try(log(x)), warning = w.handler, error = 
> e.handler)
>   ## return result with warnings and errors
>   list(result = res, warning = w.list, error = e.list)
> }
> 

Dear David,

many thanks for your help. 
If I call your code with f(-1) and f("a"), I obtain:

> f(-1) 
$result
[1] NaN

$warning
[1] ""

$error
NULL

=> The problem is that the warning is not given.

> f("a")
Error in log(x) : Non-numeric argument to mathematical function
$result
[1] "Error in log(x) : Non-numeric argument to mathematical function\n"
attr(,"class")
[1] "try-error"

$warning
NULL

$error
NULL

=> The problem is that the error message is printed to the R console instead of 
suppressed (setting silent = TRUE didn't help either). Further, the $error 
component is empty (the error message should appear there -- if possible)

Do you know a solution?

Cheers,

Marius

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to