Преамбула:
R trace()
- мощный инструмент отладки, позволяющий пользователям "вставлять код отладки в выбранные места в любую функцию". К сожалению, использование его из командной строки может быть довольно трудоемким.
Как искусственный пример, скажем, я хочу вставить код отладки, который будет сообщать интервал между тиками, рассчитанный pretty.default()
. Я хотел бы вставить код сразу после вычисления значения delta
, примерно в четырех строках от нижней части определения функции. (Введите pretty.default
, чтобы увидеть, где я имею в виду.)
Чтобы указать эту строку, мне нужно найти, какой шаг в коде, которому он соответствует. Ответ оказывается шагом list(c(12, 3, 3))
, который я включаю в нуль, выполнив следующие шаги:
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]]
Затем я могу вставить код отладки следующим образом:
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')
Вопросы:
Итак, вот мои вопросы: есть ли способ распечатать функцию (или проанализированную ее версию) с линиями, красиво помеченными шагами, к которым они принадлежат? (Согласно Venables и Ripley, S-plus имеет функцию tprint()
, которая "производит нумерованный список тела функции для использования с аргументом at
trace
", но R, похоже, не имеет эквивалента. ) Альтернативно, есть ли еще один простой способ из командной строки быстро установить код отладки для определенной строки внутри функции?
Добавление:
Я использовал пример pretty.default()
, потому что он достаточно ручный, но с реальными/интересными функциями, многократно используя as.list()
быстро становится утомительным и отвлекающим. Вот пример:
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]]