[R] Stack trace?

R. Michael Weylandt michael.weylandt at gmail.com
Thu Nov 10 02:21:35 CET 2011


Very nifty tricks re: getting recover on warnings. Thanks,

Michael

On Wed, Nov 9, 2011 at 7:11 PM, William Dunlap <wdunlap at tibco.com> wrote:
> Bert,
>
> At the end of my previous message I mentioned tryCatch().
> I should have said withCallingHandlers().  E.g.,
>
>> f <- function() {
> +     warning("Hmmm")
> +     retval <- c(1,2) + c(5,6,7) # warns about incompatible lengths in +
> +     warning("Really?")
> +     retval
> + }
>> options(warning.expression=NULL) # just in case it had been set
>> withCallingHandlers(f(), warning=function(e){
> +     cat("encountered warning: ", conditionMessage(e), "\n")
> +     if (grepl("multiple of shorter", conditionMessage(e))) { recover() }
> +     invokeRestart("muffleWarning")
> + })
> encountered warning:  Hmmm
> encountered warning:  longer object length is not a multiple of shorter object length
>
> Enter a frame number, or 0 to exit
>
> 1: withCallingHandlers(f(), warning = function(e) {
> 2: f()
> 3: #3: .signalSimpleWarning("longer object length is not a multiple of shorter object length", quote(c(1, 2) + c(5, 6, 7)))
> 4: #3: withRestarts({
> 5: #3: withOneRestart(expr, restarts[[1]])
> 6: #3: doWithOneRestart(return(expr), restart)
> 7: #3: function (e)
>
> Selection: 0
> encountered warning:  Really?
> [1] 6 8 8
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>> -----Original Message-----
>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of William Dunlap
>> Sent: Wednesday, November 09, 2011 3:51 PM
>> To: Bert Gunter
>> Cc: r-help
>> Subject: Re: [R] Stack trace?
>>
>> It will call recover() for each warning.  When you exit recover()
>> the code continues on.  This is handy if you expect the first warning
>> or two but are curious about the third.   I'd expect that you could
>> reset options(warning.expression=NULL) when in recover() so
>> that recover() would not be called at the remaining warnings.
>>
>> > options(warning.expression=quote(recover()))
>> > f <- function() {
>> +     warning("Hmmm")
>> +     retval <- c(1,2) + c(5,6,7)
>> +     warning("Really?")
>> +     retval
>> + }
>> > f()
>>
>> Enter a frame number, or 0 to exit
>>
>> 1: f()
>> 2: #2: warning("Hmmm")
>> 3: #2: .signalSimpleWarning("Hmmm", quote(f()))
>> 4: #2: withRestarts({
>> 5: #2: withOneRestart(expr, restarts[[1]])
>> 6: #2: doWithOneRestart(return(expr), restart)
>>
>> Selection: 0
>>
>> Enter a frame number, or 0 to exit
>>
>> 1: f()
>> 2: #3: .signalSimpleWarning("longer object length is not a multiple of shorter object length",
>> quote(c(1, 2) + c(5, 6, 7)))
>> 3: #3: withRestarts({
>> 4: #3: withOneRestart(expr, restarts[[1]])
>> 5: #3: doWithOneRestart(return(expr), restart)
>>
>> Selection: 1
>> Called from: .signalSimpleWarning("longer object length is not a multiple of shorter object length",
>>     quote(c(1, 2) + c(5, 6, 7)))
>> Browse[1]> options(warning.expression=NULL)
>> Browse[1]> # hit control-D
>> Browse[1]>
>>
>> Enter a frame number, or 0 to exit
>>
>> 1: f()
>> 2: #3: .signalSimpleWarning("longer object length is not a multiple of shorter object length",
>> quote(c(1, 2) + c(5, 6, 7)))
>> 3: #3: withRestarts({
>> 4: #3: withOneRestart(expr, restarts[[1]])
>> 5: #3: doWithOneRestart(return(expr), restart)
>>
>> Selection: 0
>> [1] 6 8 8
>> Warning message:
>> In f() : Really?
>>
>> I think you could also use tryCatch(warning=function(e)...) to only call recover() at certain types
>> of warnings, perhaps by examining the text in conditionMessage(e).
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com
>> From: Bert Gunter [mailto:gunter.berton at gene.com]
>> Sent: Wednesday, November 09, 2011 3:40 PM
>> To: William Dunlap
>> Cc: r-help
>> Subject: Re: [R] Stack trace?
>>
>> To Bill's suggestion for a stack trace on warnings:
>> Question: What would this do in situations where one might get, e.g. 100 warnings?
>>
>> -- Bert
>> On Wed, Nov 9, 2011 at 3:08 PM, William Dunlap <wdunlap at tibco.com<mailto:wdunlap at tibco.com>> wrote:
>> > -----Original Message-----
>> > From: r-help-bounces at r-project.org<mailto:r-help-bounces at r-project.org> [mailto:r-help-bounces at r-
>> project.org<mailto:r-help-bounces at r-project.org>] On Behalf Of Thomas Lumley
>> > Sent: Wednesday, November 09, 2011 1:53 PM
>> > To: rkevinburton at charter.net<mailto:rkevinburton at charter.net>
>> > Cc: r-help
>> > Subject: Re: [R] Stack trace?
>> >
>> > On Thu, Nov 10, 2011 at 10:35 AM,  <rkevinburton at charter.net<mailto:rkevinburton at charter.net>>
>> wrote:
>> > >
>> > > Currently I have a for loop executing functions and at the end I get a
>> > > message like:
>> > >
>> > > There were 50 or more warnings (use warnings() to see the first 50)
>> > >
>> > > If I do what it says and type warnings(), I get 50 messages like:
>> > >
>> > > 2: In !is.na<http://is.na>(x) & !is.na<http://is.na>(rowSums(xreg)) :
>> > >   longer object length is not a multiple of shorter object length
>> > >
>> > > I am not sure what function these errors are originating from. I don't
>> > > think it is from any of the 'R' script that I wrote. I would like to see
>> > > which function is being called when this error is thrown and which
>> > > called that . . . and so on.
>> > >
>> > > I have the same problem with error messages. An error is thrown but I
>> > > don't have a call stack to help trace down the problem. Is there some
>> > > function or technique that I could use to help get a call stack?
>> >
>> > traceback() gets you a stack trace at the last error
>> >
>> > options(warn=2) makes warnings into errors
>> >
>> > options(error=recover) starts the post-mortem debugger at any error,
>> > allowing you to inspect the stack interactively.
>>
>> And
>>  options(warning.expression=quote(recover()))
>> will start that same debugger at each warning.
>>
>> Bill Dunlap
>> Spotfire, TIBCO Software
>> wdunlap tibco.com<http://tibco.com>
>>
>>
>> >   -thomas
>> >
>> > --
>> > Thomas Lumley
>> > Professor of Biostatistics
>> > University of Auckland
>> >
>> > ______________________________________________
>> > R-help at r-project.org<mailto:R-help at r-project.org> mailing list
>> > https://stat.ethz.ch/mailman/listinfo/r-help
>> > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> > and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> R-help at r-project.org<mailto:R-help at r-project.org> mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>>
>> --
>>
>> Bert Gunter
>> Genentech Nonclinical Biostatistics
>>
>> Internal Contact Info:
>> Phone: 467-7374
>> Website:
>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>
>>
>>
>>       [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list