The trace() function is very nice for setting breakpoints or other debugging code in functions and methods, but its interface is confusingly complicated.

For example, there was a question on StackOverflow recently that led to this observation:

   trace(stats::predict.lm, edit = TRUE)

will allow breakpoints to be set in stats::predict.lm, but they will only be seen if that method is called directly, not indirectly via stats::predict on an lm object. If stats is on the search list,

   trace(predict.lm, edit = TRUE)

does the same thing as you would expect.

On the other hand,

   trace(stats:::predict.lm, edit = TRUE)

sets the breakpoint so it works in predict() calls, but *not* on direct calls.

I can see that sometimes you would want to differentiate between those two ways of calling predict.lm, but I would think that normally you'd want both kinds to be debugged.

There's also an argument "where" that allows you to limit the tracing, e.g. an example allows you to trace calls to lm() coming from the nlme package (presumably by tracing only the import, but I haven't debugged it carefully).

Wouldn't it make sense for "where" to be the *only* way to limit tracing to some copies of the function, and if "where" is omitted, trace() should attempt to modify all copies?

Duncan Murdoch

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to