I've put a fix for this in place in R-devel now. It required adding
another parameter to browser(), so I'd like to test it out a while
before backporting it to 2.10.0 patched.
Please give it a try, and let me know if you notice anything wrong.
Duncan Murdoch
On 27/10/2009 12:51 PM, Romain Francois wrote:> Hello,
>
> When using recover, the called from information is always "eval(expr,
> envir, enclos)", which is not particularly useful.
>
> > f <- function( ){ g <- function(){ stop( "ouch") };
g() }
> > options( error = recover )
> > f()
> Error in g() : ouch
>
> Enter a frame number, or 0 to exit
>
> 1: f()
> 2: g()
>
> Selection: 1
> Called from: eval(expr, envir, enclos)
>
>
> I'm using the following heuristic to guess if this was called from
> recover and grab the actual call, and was wondering if something similar
> could/should be integrated into R:
>
> getcall <- function(){
> calls <- sys.calls()
> calls <- calls[ -length(calls) ]
> funs <- sapply( calls, function(x) as.character(x)[1L] )
> frames <- sys.frames()
> frames <- frames[ -length(frames) ]
> nc <- length(calls)
>
> if( nc >= 3L &&
> identical( tail(funs, 2L ), rep("eval", 2L) ) &&
> identical(
> paste( as.character( calls[[ nc - 1L ]] ), collapse = "--" ),
> "eval--quote(browser())--sys.frame(which)" )
> ) {
>
> w <- get( "which", sys.frame(nc- 2L ), inherits = FALSE )
> if( typeof( w ) == "integer" && length(w) == 1L ){
> return( calls[[w]] )
> }
>
> }
> calls[[nc]]
>
> }
>
> I'd be happy to work on an internal version instead of this one in R.
>
> Romain
>
>