R: расширенная отладка для линейных цепочек кода

Я пытаюсь выяснить, возможно ли при разумном объеме программирования создать определенную функцию отладки с помощью функций метапрограммирования R.

Предположим, у меня есть блок кода, так что каждая строка использует в качестве всего или части своего ввода вывод из предыдущей строки - вид кода, который вы могли бы построить с конвейерами (хотя конвейер здесь не используется).

{
f1(args1)                  -> out1
f2(out1, args2)            -> out2
f3(out2, args3)            -> out3
...
fn(out<n-1>, args<n>)      -> out<n>
}

Где, например, может быть:

f1 <- function(first_arg, second_arg, ...){my_body_code},

и ты звонишь f1 в блоке как:

f1(second_arg = 1:5, list(a1 ="A", a2 =1), abc = letters[1:3], fav = foo_foo)

где foo_foo это объект, определенный в вызывающей среде f1.

Мне нужна функция, которую я мог бы обернуть вокруг своего блока, которая для каждой строки кода создавала бы запись в списке. Каждая запись будет называться (line1, line2), и каждая строка будет иметь вложенную запись для каждого аргумента и для вывода функции. записи аргументов будут состоять, во-первых, из имени формального объекта, которому соответствует фактический аргумент, во-вторых, из выражения или имени, предоставленного этому аргументу, если он есть (и заполнителя, если аргумент является просто константой), и в-третьих, значение этого выражения, как если бы оно было немедленно принудительно при входе в функцию. (Я бы предпочел иметь значение на момент выполнения обещания, но это кажется мне гораздо более сложной проблемой, и два значения чаще всего будут одинаковыми).

Все аргументы, присвоенные ... (если есть) войдет в подсписок dots = list() с записями, названными, если они имеют имена и соответствующим образом помечены (..1, ..2,и т.д.), если они назначены позиционно. Последним элементом каждого подсписка строк будет имя вывода и его значение.

Смысл этого в том, чтобы создать достаточно полную запись работы блока кода. Я думаю, что это аналог разработанной версииpurrr::safely это не ограничивается итерацией и сохраняет более подробную запись каждого шага, и действительно, если функция завершается с ошибкой, вам может потребоваться сообщение об ошибке в записи списка, а также большая часть согласованных аргументов, которые могли быть перед произошла ошибка.

Мне кажется, что это было бы очень полезно при отладке такого линейного кода. Это позволяет делать сложные вещи, используя только отладчик RStudio. Например, он позволяет отслеживать код в обратном направлении. Я могу не знать, что значение в out2 неверно, до тех пор, пока не увижу более поздний вывод. При пошаговом режиме промежуточные значения не сохраняются, если вы не вставите для этого кучу дополнительного кода. Кроме того, это сохраняет информацию, необходимую для отслеживания ошибок сопоставления, которые возникают еще до создания обещаний. К тому времени, когда вы увидите результат, полученный в результате таких ошибок с помощью пошагового выполнения, информация о сопоставлении, вероятно, исчезнет.

На самом деле я написал код, который берет функцию конвейера и устраняет каналы, чтобы поместить его в этот формат, просто используя манипуляции с текстом. (На самом деле, это была "трубка Bizarro" Джона Маунта, которая заставила меня задуматься об этом). И если я, или мы, или вы, сможем понять, как это сделать, я бы надеялся серьезно запустить вторую версию, где каждая функция вызывает следующую, снабжая ее аргументами внутри, а не извне - как трассировка где вы получаете переданные значения аргументов, а также имя функции и формальные значения. В других языках есть такие среды отладки (например, GDB), и я мечтал о такой среде для R как минимум пять лет, может быть, 10, и это похоже на шаг к этому.

1 ответ

Просто выдайте trace отображается для каждой функции, которую вы хотите отслеживать.

f <- function(x, y) {
  z <- x + y
  z
}
trace(f, exit = quote(print(returnValue())))
f(1,2)

давая следующее, которое показывает имя функции, ввод и вывод. (Последние 3 взяты из самой функции.)

Tracing f(1, 2) on exit 
[1] 3
[1] 3
Другие вопросы по тегам