[R] Stack trace?

William Dunlap wdunlap at tibco.com
Thu Nov 10 01:11:40 CET 2011


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.



More information about the R-help mailing list