Подтвердить что ты не робот

Можете ли вы сделать R печатать более подробные сообщения об ошибках?

Я часто расстраивался сообщениями об ошибках R. Я не говорю во время интерактивной сессии, я имею в виду, когда вы используете script. Сообщения об ошибках не распечатывают номера строк, и часто бывает трудно проследить строку нарушения и причину ошибки (даже если вы можете найти местоположение).

Совсем недавно мой R script провалился с невероятно проницательным сообщением: "Исполнение остановлено". То, как я обычно трачу такие ошибки, заключается в том, что множество сообщений для печати на протяжении script - но это боль. Мне иногда приходится проходить через script по очереди в интерактивном сеансе, чтобы найти ошибку.

Есть ли у кого-нибудь лучшее решение, как сделать вывод ошибки R более информативным?

EDIT: для работы в интерактивных сеансах работают много R-отладочных приложений. Я ищу помощь по сценариям командной строки, которые запускаются через Rscript. Я не посередине сеанса R, когда возникает ошибка, я нахожусь в оболочке bash. Я не могу запустить "traceback()"

4b9b3361

Ответ 2

@Nathan Ну добавить эту строку sink(stdout(), type="message") в начале script, и вы должны получить в консольном сообщении как содержимое script, так и выводить вместе с сообщением об ошибке, чтобы вы могли видеть его как в интерактивном режиме на консоли, (тогда вы также можете перенаправить файл журнала, если хотите сохранить консоль "чистой" )

Ответ 3

Посмотрите на мой пакет tryCatchLog (https://github.com/aryoda/tryCatchLog).

В то время как невозможно улучшить сообщения об ошибках R напрямую, вы можете сэкономить много времени, указав точную строку кода ошибки и имея фактические переменные в момент ошибки, хранящейся в дампе для анализа "post mortem"

Основными преимуществами функции tryCatchLog над tryCatch являются

  • легко регистрировать ошибки, предупреждения и сообщения в файле или консоли
  • предупреждения не останавливают выполнение программы (tryCatch останавливает выполнение, если вы передаете функцию обработчика предупреждений)
  • идентифицирует источник ошибок и предупреждений, регистрируя трассировку стека со ссылкой на имя исходного файла и номер строки (поскольку трассировка не содержит полную трассировку стека)
  • позволяет анализировать после ошибок, создавая файл дампа со всеми переменными глобальной среды (рабочей области) и каждой функцией (через dump.frames) - очень полезно для пакетных заданий, которые вы не может отлаживать сервер напрямую, чтобы воспроизвести ошибку!

Ответ 4

Один из способов внутри script, чтобы получить дополнительную информацию о том, где произошла ошибка, - перенаправить сообщение R в тот же поток, что и ошибки:

sink(stdout(), type="message") 

Таким образом вы получаете как сообщения, так и ошибки на одном выходе, чтобы вы увидели, какая строка подняла ошибку...