Ответ 1
Попробуйте несколько предложений в этом сообщении:
Какая ваша любимая трюк отладки R?
В частности, findLineNum()
и traceback()
/setBreakpoint()
.
Я часто расстраивался сообщениями об ошибках R. Я не говорю во время интерактивной сессии, я имею в виду, когда вы используете script. Сообщения об ошибках не распечатывают номера строк, и часто бывает трудно проследить строку нарушения и причину ошибки (даже если вы можете найти местоположение).
Совсем недавно мой R script провалился с невероятно проницательным сообщением: "Исполнение остановлено". То, как я обычно трачу такие ошибки, заключается в том, что множество сообщений для печати на протяжении script - но это боль. Мне иногда приходится проходить через script по очереди в интерактивном сеансе, чтобы найти ошибку.
Есть ли у кого-нибудь лучшее решение, как сделать вывод ошибки R более информативным?
EDIT: для работы в интерактивных сеансах работают много R-отладочных приложений. Я ищу помощь по сценариям командной строки, которые запускаются через Rscript. Я не посередине сеанса R, когда возникает ошибка, я нахожусь в оболочке bash. Я не могу запустить "traceback()"
Попробуйте несколько предложений в этом сообщении:
Какая ваша любимая трюк отладки R?
В частности, findLineNum()
и traceback()
/setBreakpoint()
.
@Nathan Ну добавить эту строку sink(stdout(), type="message")
в начале script, и вы должны получить в консольном сообщении как содержимое script, так и выводить вместе с сообщением об ошибке, чтобы вы могли видеть его как в интерактивном режиме на консоли, (тогда вы также можете перенаправить файл журнала, если хотите сохранить консоль "чистой" )
Посмотрите на мой пакет tryCatchLog
(https://github.com/aryoda/tryCatchLog).
В то время как невозможно улучшить сообщения об ошибках R напрямую, вы можете сэкономить много времени, указав точную строку кода ошибки и имея фактические переменные в момент ошибки, хранящейся в дампе для анализа "post mortem"
Основными преимуществами функции tryCatchLog
над tryCatch
являются
Один из способов внутри script, чтобы получить дополнительную информацию о том, где произошла ошибка, - перенаправить сообщение R в тот же поток, что и ошибки:
sink(stdout(), type="message")
Таким образом вы получаете как сообщения, так и ошибки на одном выходе, чтобы вы увидели, какая строка подняла ошибку...