[Rd] R: determine if `suppressMessages()` has been invoked

Ivan Krylov kry|ov@r00t @end|ng |rom gm@||@com
Sun Feb 19 18:01:37 CET 2023


On Sun, 19 Feb 2023 15:37:33 +0100 (CET)
Nino Hardt <me using ninohardt.com> wrote:

> I would like to create a function that detects if suppressMessages
> has been invoked upon running that same function. 

Would you mind letting us know why? Just curious. Normally, I would
just use message() for everything and let the users decide whether they
want to see it.

> I was looking through [R Internals], but I haven't found an answer. I
> do not understand **how** suppressMessages works.

It works by cooperating with message().

message() itself works by trying to raise a "message" condition and
providing a "muffleMessage" restart that does nothing. If the condition
wasn't handled (the "muffleMessage" restart wasn't called by the
handler), the text of the message is printed.

In turn, suppressMessages() sets up a handler for conditions of class
"message" that invokes the "muffleMessage" restart provided by
message() itself above.

We can use the fact that the availability of the "muffleMessage"
restart is a documented detail and check whether signalling a "message"
condition will call this restart:

are_messages_suppressed <- function() withRestarts(
 {
  signalCondition(simpleMessage(''))
  # we stay here if restart is not invoked
  FALSE
 },
 muffleMessage = function()
  # we jump here if restart is invoked
  TRUE
)
are_messages_suppressed()
# [1] FALSE
suppressMessages(are_messages_suppressed())
# [1] TRUE

I don't think I understand handlers and restarts enough to explain them
well, but the following link seems to be one of the defining documents
for R's condition handling system:
https://homepage.stat.uiowa.edu/~luke/R/exceptions/simpcond.html

Hadley Wickham's Advanced R (first edition only) contains a good
explanation of R's condition system:
http://adv-r.had.co.nz/Exceptions-Debugging.html
http://adv-r.had.co.nz/beyond-exception-handling.html

(In my opinion, this could be a better question for R-help, since we
ought to be using documented R APIs here.)

-- 
Best regards,
Ivan



More information about the R-devel mailing list