Re: [Rd] suppress *specific* warnings?

From: <luke-tierney_at_uiowa.edu>
Date: Mon, 22 Oct 2012 11:57:49 -0500

On Sun, 21 Oct 2012, Martin Morgan wrote:

> On 10/21/2012 12:28 PM, Ben Bolker wrote:
>>
>> Not desperately important, but nice to have and possibly of use to
>> others, is the ability to suppress specific warnings rather than
>> suppressing warnings indiscriminately. I often know of a specific
>> warning that I want to ignore (because I know that's it's a false
>> positive/ignorable), but the current design of suppressWarnings() forces
>> me to ignore *any* warnings coming from the expression.
>>
>> I started to write a new version that would check and, if supplied
>> with a regular expression, would only block matching warnings and
>> otherwise would produce the warnings as usual, but I don't quite know
>> enough about what I'm doing: see ??? in expression below.
>>
>> Can anyone help, or suggest pointers to relevant
>> examples/documentation (I've looked at demo(error.catching), which isn't
>> helping me ... ?)
>>
>> suppressWarnings2 <- function(expr,regex=NULL) {
>> opts <- options(warn = -1)
>> on.exit(options(opts))
>
> I'm not really sure what the options(warn=-1) is doing there, maybe its for
> efficiency to avoid generating a warning message (as distinct from signalling

The sources in srs/library/base/conditions.R have

suppressWarnings <- function(expr) {

     ops <- options(warn = -1) ## FIXME: temporary hack until R_tryEval
     on.exit(options(ops))     ## calls are removed from methods code
     withCallingHandlers(expr,
                         warning=function(w)
                             invokeRestart("muffleWarning"))
}

I uspect we have still not entirely eliminated R_tryEval in this context but I'm not sure. Will check when I get a chance.

> a warning). I think you're after something like
>
> suppressWarnings2 <-
> function(expr, regex=character())
> {
> withCallingHandlers(expr, warning=function(w) {
> if (length(regex) == 1 && length(grep(regex, conditionMessage(w))))
> {
> invokeRestart("muffleWarning")
> }
> })
> }

A problem with using expression matching is of course that this fails with internationalized messages. Ideally warnings should be signaled as warning conditions of a particular class, and that class can be used to discriminate. Unfortunately very few warnings are designed this way.

Best,

luke

>
> If the restart isn't invoked, then the next handler is called and the
> warning is handled as normal. So with
>
> f <- function() {
> warning("oops")
> 2
> }
>
> there is
>
>> suppressWarnings2(f())
> [1] 2
> Warning message:
> In f() : oops
>> suppressWarnings2(f(), "oops")
> [1] 2
>
> For your own code I think a better strategy is to create a sub-class of
> warnings that can be handled differently
>
> mywarn <-
> function(..., call.=TRUE, immediate.=FALSE, domain=NULL)
> {
> msg <- .makeMessage(..., domain=domain, appendLF=FALSE)
> call <- NULL
> if (call.)
> call <- sys.call(1L)
> class <- c("silencable", "simpleWarning", "warning", "condition")
> cond <- structure(list(message=msg, call=call), class=class)
> warning(cond)
> }
>
> suppressWarnings3 <-
> function(expr)
> {
> withCallingHandlers(expr, silencable=function(w) {
> invokeRestart("muffleWarning")
> })
> }
>
> then with
>
> g <- function() {
> mywarn("oops")
> 3
> }
>
>> suppressWarnings3(f())
> [1] 2
> Warning message:
> In f() : oops
>> g()
> [1] 3
> Warning message:
> In g() : oops
>> suppressWarnings3(g())
> [1] 3
>
>> withCallingHandlers(expr, warning = function(w) {
>> ## browser()
>> if (is.null(regex) || grepl(w[["message"]],regex)) {
>> invokeRestart("muffleWarning")
>> } else {
>> ## ? what do I here to get the warning issued?
>> ## browser()
>> ## computeRestarts() shows "browser",
>> ## "muffleWarning", and "abort" ...
>> options(opts)
>> warning(w$message)
>> ## how can I get back from here to the calling point
>> ## *without* muffling warnings ... ?
>> }
>> })
>> }
>>
>> suppressWarnings2(sqrt(-1))
>> suppressWarnings2(sqrt(-1),"abc")
>>
>> It seems to me I'd like to have a restart option that just returns to
>> the point where the warning was caught, *without* muffling warnings ...
>> ? But I don't quite understand how to set one up ...
>>
>> Ben Bolker
>>
>> ______________________________________________
>> R-devel_at_r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:   luke-tierney_at_uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Mon 22 Oct 2012 - 17:05:09 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 23 Oct 2012 - 18:10:48 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive