Message-ID: <8b356f880904170755xef5b982s3c49d8b1363d0e89@mail.gmail.com>
Date: 2009-04-17T14:55:36Z
From: Stavros Macrakis
Subject: Using trace
In-Reply-To: <38b9f0350904161826u2b900579j9ffda68035ab53e9@mail.gmail.com>
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
>