I would like to trace functions, displaying their arguments and return value, but I haven't been able to figure out how to do this with the 'trace' function. After some thrashing, I got as far as this: fact <- function(x) if(x<1) 1 else x*fact(x-1) tracefnc <- function() dput(as.list(parent.frame()), # parent.frame() holds arg list control=NULL) trace("fact",tracer=tracefnc,print=FALSE) but I couldn't figure out how to access the return value of the function in the 'exit' parameter. The above also doesn't work for "..." arguments. (More subtly, it forces the evaluation of promises even if they are otherwise unused -- but that is, I suppose, a weird and obscure case.) Surely someone has solved this already? What I'm looking for is something very simple, along the lines of old-fashioned Lisp trace:> defun fact (i) (if (< i 1) 1 (* i (fact (+ i -1)))))FACT> (trace fact)(FACT)> (fact 3)1> (FACT 3) 2> (FACT 2) 3> (FACT 1) 4> (FACT 0) <4 (FACT 1) <3 (FACT 1) <2 (FACT 2) <1 (FACT 6) 6 Can someone help? Thanks, -s
I posted the query below on r-help, but perhaps r-devel is more suitable... (I guess "r-devel" should be read as "those who develop (i.e. write) programs in R" rather than "those who develop R"?) -s I would like to trace functions, displaying their arguments and return value, but I haven't been able to figure out how to do this with the 'trace' function. After some thrashing, I got as far as this: ? ?fact <- function(x) if(x<1) 1 else x*fact(x-1) ? ?tracefnc <- function() dput(as.list(parent.frame()), ?# parent.frame() holds arg list ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?control=NULL) ? ?trace("fact",tracer=tracefnc,print=FALSE) but I couldn't figure out how to access the return value of the function in the 'exit' parameter. ?The above also doesn't work for "..." arguments. ?(More subtly, it forces the evaluation of promises even if they are otherwise unused -- but that is, I suppose, a weird and obscure case.) Surely someone has solved this already? What I'm looking for is something very simple, along the lines of old-fashioned Lisp trace:> defun fact (i) (if (< i 1) 1 (* i (fact (+ i -1)))))FACT> (trace fact)(FACT)> (fact 3)?1> (FACT 3) ? ?2> (FACT 2) ? ? ?3> (FACT 1) ? ? ? ?4> (FACT 0) ? ? ? ?<4 (FACT 1) ? ? ?<3 (FACT 1) ? ?<2 (FACT 2) ?<1 (FACT 6) 6 Can someone help? Thanks, ? ? ? ? -s
Can you just print what you need to know? For example:> fact <- function(x) {+ if(x<1) ans <- 1 else ans <- x*fact(x-1) + print(sys.call()) + cat(sprintf("X is %i\n",x)) + print(ans) + }> fact(4)fact(x - 1) X is 0 [1] 1 fact(x - 1) X is 1 [1] 1 fact(x - 1) X is 2 [1] 2 fact(x - 1) X is 3 [1] 6 fact(4) X is 4 [1] 24 2009/4/13 Stavros Macrakis <macrakis at alum.mit.edu>:> I would like to trace functions, displaying their arguments and return > value, but I haven't been able to figure out how to do this with the > 'trace' function. > > After some thrashing, I got as far as this: > > ? ?fact <- function(x) if(x<1) 1 else x*fact(x-1) > ? ?tracefnc <- function() dput(as.list(parent.frame()), ?# > parent.frame() holds arg list > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?control=NULL) > ? ?trace("fact",tracer=tracefnc,print=FALSE) > > but I couldn't figure out how to access the return value of the > function in the 'exit' parameter. ?The above also doesn't work for > "..." arguments. ?(More subtly, it forces the evaluation of promises > even if they are otherwise unused -- but that is, I suppose, a weird > and obscure case.) > > Surely someone has solved this already? > > What I'm looking for is something very simple, along the lines of > old-fashioned Lisp trace: > >> defun fact (i) (if (< i 1) 1 (* i (fact (+ i -1))))) > FACT >> (trace fact) > (FACT) >> (fact 3) > ?1> (FACT 3) > ? ?2> (FACT 2) > ? ? ?3> (FACT 1) > ? ? ? ?4> (FACT 0) > ? ? ? ?<4 (FACT 1) > ? ? ?<3 (FACT 1) > ? ?<2 (FACT 2) > ?<1 (FACT 6) > 6 > > Can someone help? Thanks, > > ? ? ? ? -s > > ______________________________________________ > 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. >-- HUANG Ronggui, Wincent PhD Candidate Dept of Public and Social Administration City University of Hong Kong Home page: http://asrr.r-forge.r-project.org/rghuang.html
Reasonably Related Threads
- Using trace
- [LLVMdev] MCJIT and DWARF debugging info and lldb
- Possible (ab)use of lexical scoping in R ?
- [LLVMdev] MCJIT and DWARF debugging info and lldb
- [LLVMdev] Looking for advice on how to debug a problem with C++ style exception handling code that my compiler generates.