[R] Using trace

Stavros Macrakis macrakis at alum.mit.edu
Fri Apr 17 16:55:36 CEST 2009


Well, yes, of course I could add the code to the function by hand.  I
could also calculate square roots by hand.  But -- as in every other
basic programming environment -- there exists an R function 'trace'
which appears to automate the process, and I can't figure out how to
use it to handle this most elementary and standard case.  Clearly I'm
missing something.

              -s

On Thu, Apr 16, 2009 at 9:26 PM, ronggui <ronggui.huang at gmail.com> wrote:
> 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
>



More information about the R-help mailing list