[prev in list] [next in list] [prev in thread] [next in thread] 

List:       r-devel
Subject:    [Rd] recover and "called from" information
From:       Romain Francois <romain.francois () dbmail ! com>
Date:       2009-10-27 16:51:22
Message-ID: 4AE7250A.3090209 () dbmail ! com
[Download RAW message or body]

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


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://tr.im/BcPw : celebrating R commit #50000
|- http://tr.im/ztCu : RGG #158:161: examples of package IDPmisc
`- http://tr.im/yw8E : New R package : sos

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic