[Rd] capturing multiple warnings in tryCatch()

Fox, John j|ox @end|ng |rom mcm@@ter@c@
Fri Dec 3 20:27:48 CET 2021


Dear Rui,

Thanks for this. Simon referred to demo(error.catching), and Adrian's version returns the printed representation of the result along with messages.

Best,
 John

On 2021-12-03, 11:35 AM, "Rui Barradas" <ruipbarradas using sapo.pt> wrote:

    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