Избегая вызовов браузера в R

У меня сложный script, который охватывает несколько функций (и файлов). Для целей отладки мне нужно вставлять вызовы browser во всевозможные уголки и трещины. Когда я, по-видимому, что-то исправляю, я хочу запустить все без отладки, ergo избегая вызовов browser, потому что комментирование всех вызовов браузеров будет означать значительные усилия с моей стороны. @mdsumner on R chat предложил запустить script в неинтерактивном режиме (т.е. с помощью Rscript.exe в Windows), но мне было бы полезно, если бы это было сделано на моей консоли, чтобы иметь возможность получить доступ, например, traceback. Я прошел через браузерные документы, и я не могу найти вариант, который приблизился бы к тому, чего я пытаюсь достичь. Любые предложения?

Ответ 1

Вот три возможности:

1) Перезаписать команду браузера. Добавьте эту команду в свое глобальное рабочее пространство, чтобы отключить команды браузера:

browser <- list

и снова включить его

rm(browser)

Это, вероятно, самый простой, но немного уродливый из-за того, что переменная browser остается в глобальной среде.

Следующие два решения немного дольше, но вместо этого используют опции, чтобы новые переменные не вводились в глобальную среду. Также они таковы, что, если параметры не заданы, отладка не выполняется, поэтому вам нужно установить параметр, если вы хотите отлаживать. Решение if может быть быстрее, чем решение expr, хотя оно, вероятно, не является материалом.

2) Использовать аргумент expr = с опцией. Замените каждую команду браузера:

browser(expr = isTRUE(getOption("Debug")))

а затем установите для параметра "Debug" значение TRUE, чтобы включить отладку.

options(Debug = TRUE)

или установите его на что-то еще или удалите, чтобы отключить отладку:

options(Debug = NULL)

3) Использовать, если с опцией. Замените каждую команду браузера:

if (isTRUE(getOption("Debug"))) browser()

а затем установите параметр Debug или нет, как в предыдущей точке.

Ответ 2

Определить глобальное логическое значение

debug_mode <- TRUE

а затем вместо browser() используйте

if (debug_mode) browser()

Ответ 3

Я думаю, что это просто связано с тонким использованием функции отладки. Если вы хотите выборочно контролировать использование browser(), поместите его внутри if, который позволяет включать или отключать отладку для этой функции. Когда вы хотите, чтобы браузер вызывался, сделайте это явным, как

myfun(x, debug =  TRUE)