# [R] Using trace

Stavros Macrakis macrakis at alum.mit.edu
Fri Apr 17 18:56:27 CEST 2009

```Yes, that is similar to the solution in my original posting, but
doesn't solve the problem I was having with that solution, namely
reporting on the return value.

-s

On Fri, Apr 17, 2009 at 11:28 AM, ronggui <ronggui.huang at gmail.com> wrote:
> Here is a partial solution:
>
>> trace(fact,quote({cat(sprintf("x= %i\n",x));return}),print=T)
> [1] "fact"
>> fact(4)
> Tracing fact(4) on entry
> x= 4
> Tracing fact(x - 1) on entry
> x= 3
> Tracing fact(x - 1) on entry
> x= 2
> Tracing fact(x - 1) on entry
> x= 1
> Tracing fact(x - 1) on entry
> x= 0
> [1] 24
>
>
> 2009/4/17 Stavros Macrakis <macrakis at alum.mit.edu>:
>> 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
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>>
>>>
>>>
>>>
>>> --
>>> HUANG Ronggui, Wincent
>>> PhD Candidate
>>> Dept of Public and Social Administration
>>> City University of Hong Kong
>>>
>>
>
>
>
> --
> HUANG Ronggui, Wincent
> PhD Candidate
> Dept of Public and Social Administration
> City University of Hong Kong