[Rd] capturing multiple warnings in tryCatch()
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Fri Dec 3 17:35:29 CET 2021
Hello,
I remembered having seen a function tryCatch.W.E and after an online
search, found where.
It was in a R-Help post and in demo(error.catching). The question by
Marius Hofert [1] was answered, among others, by Martin Maechler [2]
which included the function tryCatch.W.E.
These posts refer to an old thread dated 2004 [3], with an answer by
Luke Tierney [4]. The function withWarnings posted by Luke returns all
warning messages in a list, as seen below.
I repost the function to have this self contained.
withWarnings <- function (expr) {
warnings <- character()
retval <- withCallingHandlers(expr, warning = function(ex) {
warnings <<- c(warnings, conditionMessage(ex))
invokeRestart("muffleWarning")
})
list(Value = retval, Warnings = warnings)
}
withWarnings(foo())
#$Value
#[1] "warning 2"
#
#$Warnings
#[1] "warning 1" "warning 2"
Function tryCatch.W.E is now part of contributed package simsalapar [5],
with credits to Marius and Martin given in its documentation.
[1] https://stat.ethz.ch/pipermail/r-help/2010-December/262185.html
[2] https://stat.ethz.ch/pipermail/r-help/2010-December/262626.html
[3] https://stat.ethz.ch/pipermail/r-help/2004-June/052092.html
[4] https://stat.ethz.ch/pipermail/r-help/2004-June/052132.html
[5] https://CRAN.R-project.org/package=simsalapar
Hope this helps,
Rui Barradas
Às 22:37 de 02/12/21, Fox, John escreveu:
> Dear Henrik, Simon, and Adrian,
>
> As it turns out Adrian's admisc::tryCatchWEM() *almost* does what I want, which is both to capture all messages and the result of the expression (rather than the visible representation of the result). I was easily able to modify tryCatchWEM() to return the result.
>
> Henrik: I was aware that tryCatch() doesn't return the final result of the expression, and I was previously re-executing the expression to capture the reult, but only getting the first warning message, along with the result.
>
> Thanks for responding to my question and providing viable solutions,
> John
>
> On 2021-12-02, 5:19 PM, "Henrik Bengtsson" <henrik.bengtsson using gmail.com> wrote:
>
> Simon's suggestion with withCallingHandlers() is the correct way.
> Also, note that if you use tryCatch() to catch warnings, you're
> *interrupting* the evaluation of the expression of interest, e.g.
>
> > res <- tryCatch({ message("hey"); warning("boom"); message("there"); 42 }, warning = function(w) { message("Warning caught: ", conditionMessage(w)); 3.14 })
> hey
> Warning caught: boom
> > res
> [1] 3.14
>
> Note how it never completes your expression.
>
> /Henrik
>
> On Thu, Dec 2, 2021 at 1:14 PM Simon Urbanek
> <simon.urbanek using r-project.org> wrote:
> >
> >
> > Adapted from demo(error.catching):
> >
> > > W=list()
> > > withCallingHandlers(foo(), warning=function(w) { W <<- c(W, list(w)); invokeRestart("muffleWarning") })
> > > str(W)
> > List of 2
> > $ :List of 2
> > ..$ message: chr "warning 1"
> > ..$ call : language foo()
> > ..- attr(*, "class")= chr [1:3] "simpleWarning" "warning" "condition"
> > $ :List of 2
> > ..$ message: chr "warning 2"
> > ..$ call : language foo()
> > ..- attr(*, "class")= chr [1:3] "simpleWarning" "warning" "condition"
> >
> > Cheers,
> > Simon
> >
> >
> > > On Dec 3, 2021, at 10:02 AM, Fox, John <jfox using mcmaster.ca> wrote:
> > >
> > > Dear R-devel list members,
> > >
> > > Is it possible to capture more than one warning message using tryCatch()? The answer may be in ?conditions, but, if it is, I can't locate it.
> > >
> > > For example, in the following only the first warning message is captured and reported:
> > >
> > >> foo <- function(){
> > > + warning("warning 1")
> > > + warning("warning 2")
> > > + }
> > >
> > >> foo()
> > > Warning messages:
> > > 1: In foo() : warning 1
> > > 2: In foo() : warning 2
> > >
> > >> bar <- function(){
> > > + tryCatch(foo(), warning=function(w) print(w))
> > > + }
> > >
> > >> bar()
> > > <simpleWarning in foo(): warning 1>
> > >
> > > Is there a way to capture "warning 2" as well?
> > >
> > > Any help would be appreciated.
> > >
> > > John
> > >
> > > --
> > > John Fox, Professor Emeritus
> > > McMaster University
> > > Hamilton, Ontario, Canada
> > > Web: http://socserv.mcmaster.ca/jfox/
> > >
> > >
> > >
> > > ______________________________________________
> > > R-devel using r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-devel
> > >
> >
> > ______________________________________________
> > R-devel using r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
More information about the R-devel
mailing list