What is a fast way to set debugging code at a given line in a function?
Posted
by
Josh O'Brien
on Stack Overflow
See other posts from Stack Overflow
or by Josh O'Brien
Published on 2012-07-03T21:04:44Z
Indexed on
2012/07/03
21:15 UTC
Read the original article
Hit count: 251
Preamble:
R's trace()
is a powerful debugging tool, allowing users to "insert debugging code at chosen places in any function". Unfortunately, using it from the command-line can be fairly laborious.
As an artificial example, let's say I want to insert debugging code that will report the between-tick interval calculated by pretty.default()
. I'd like to insert the code immediately after the value of delta
is calculated, about four lines up from the bottom of the function definition. (Type pretty.default
to see where I mean.)
To indicate that line, I need to find which step in the code it corresponds to. The answer turns out to be step list(c(12, 3, 3))
, which I zero in on by running through the following steps:
as.list(body(pretty.default))
as.list(as.list(body(pretty.default))[[12]])
as.list(as.list(as.list(body(pretty.default))[[12]])[[3]])
as.list(as.list(as.list(body(pretty.default))[[12]])[[3]])[[3]]
I can then insert debugging code like this:
trace(what = 'pretty.default',
tracer = quote(cat("\nThe value of delta is: ", delta, "\n\n")),
at = list(c(12,3,3)))
## Try it
a <- pretty(c(1, 7843))
b <- pretty(c(2, 23))
## Clean up
untrace('pretty.default')
Questions:
So here are my questions: Is there a way to print out a function (or a parsed version of it) with the lines nicely labeled by the steps to which they belong? Alternatively, is there another easier way, from the command line, to quickly set debugging code for a specific line within a function?
Addendum:
I used the pretty.default()
example because it is reasonably tame, but with real/interesting functions, repeatedly using as.list()
quickly gets tiresome and distracting. Here's an example:
as.list(as.list(as.list(as.list(as.list(as.list(as.list(as.list(as.list(body(#
model.frame.default))[[26]])[[3]])[[2]])[[4]])[[3]])[[4]])[[4]])[[4]])[[3]]
© Stack Overflow or respective owner