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" <ruipbarra...@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.bengts...@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.urba...@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 <j...@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@r-project.org mailing list > > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > > > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel