Если я запускаю длинный сценарий R из командной строки (R --slave script.R), как я могу заставить его выдавать номера строк при ошибках?
Я не хочу добавлять в сценарий команды отладки, если это вообще возможно - я просто хочу, чтобы R вел себя как большинство других языков сценариев ...
Ответы:
Это не даст вам номер строки, но сообщит вам, где происходит сбой в стеке вызовов, что очень полезно:
[Edit:] При запуске сценария из командной строки вам придется пропустить один или два вызова, см. Traceback () для интерактивных и неинтерактивных сеансов R
Я не знаю другого способа сделать это без обычных подозреваемых в отладке:
Возможно, вы захотите посмотреть этот связанный пост.
[Edit:] Извините ... только что увидел, что вы запускаете это из командной строки. В этом случае я бы посоветовал поработать с функциональностью опций (ошибок). Вот простой пример:
Вы можете создать сколь угодно подробный сценарий для ошибки, поэтому вам нужно просто решить, какая информация вам нужна для отладки.
В противном случае, если есть определенные области, которые вас беспокоят (например, подключение к базе данных), заключите их в функцию tryCatch ().
источник
options(error=function() { traceback(2); if(!interactive()) quit("no", status = 1, runLast = FALSE) })
(см. Комментарий принятого ответа). Я думаю, было бы разумнее добавить его к ответу здесь, а не просто указывать ссылку на другой поток.Выполнение
options(error=traceback)
дает немного больше информации о содержании строк, ведущих к ошибке. Он вызывает появление трассировки, если есть ошибка, и для некоторых ошибок он имеет номер строки с префиксом#
. Но это удачно или нет, многие ошибки не получают номеров строк.источник
No traceback available
после ошибки.Поддержка этого появится в R 2.10 и позже. Дункан Мердок только что написал в r-devel 10 сентября 2009 г. о findLineNum и setBreapoint :
источник
Вы делаете это, устанавливая
Мне просто интересно, почему этот параметр не установлен по умолчанию в R? Так должно быть, как и на любом другом языке.
источник
У меня сработало указание глобальной опции R для обработки некатастрофических ошибок, а также настроенный рабочий процесс для сохранения информации об ошибке и изучения этой информации после сбоя. В настоящее время я использую R версии 3.4.1. Ниже я включил описание рабочего процесса, который работал у меня, а также код, который я использовал для установки параметра глобальной обработки ошибок в R.
Как я настроил, обработка ошибок также создает файл RData, содержащий все объекты в рабочей памяти на момент ошибки. Этот дамп может быть считан обратно в R с помощью,
load()
а затем различные среды, которые существовали на момент ошибки, могут быть проверены в интерактивном режиме с помощьюdebugger(errorDump)
.Замечу, что мне удалось получить номера строк на
traceback()
выходе из любых пользовательских функций в стеке, но только если я использовал этуkeep.source=TRUE
опцию при вызовеsource()
любых пользовательских функций, используемых в моем скрипте. Без этой опции установка опции глобальной обработки ошибок, как показано ниже, отправляла полный выводtraceback()
в журнал ошибок с именемerror.log
, но номера строк были недоступны.Вот общие шаги, которые я предпринял в своем рабочем процессе, и то, как я смог получить доступ к дампу памяти и журналу ошибок после неинтерактивного сбоя R.
Я поместил следующее вверху основного сценария, который я вызвал из командной строки. Это устанавливает параметр глобальной обработки ошибок для сеанса R. Назывался мой основной сценарий
myMainScript.R
. После различных строк кода есть комментарии, описывающие, что они делают. По сути, с этой опцией, когда R обнаруживает срабатывающую ошибкуstop()
, он создает файл дампа рабочей памяти RData (* .rda) во всех активных средах в каталоге,~/myUsername/directoryForDump
а также записывает журнал ошибокerror.log
с некоторой полезной информацией в тот же каталог. Вы можете изменить этот фрагмент, чтобы добавить другую обработку ошибок (например, добавить отметку времени в файл дампа, имена файлов журнала ошибок и т. Д.).Убедитесь, что из основного скрипта и любых последующих вызовов функций, каждый раз при получении функции используется опция
keep.source=TRUE
. То есть, чтобы создать функцию, вы должны использоватьsource('~/path/to/myFunction.R', keep.source=TRUE)
. Это необходимо, чтобыtraceback()
вывод содержал номера строк. Похоже, вы также сможете установить эту опцию глобальноoptions( keep.source=TRUE )
, но я не проверял, работает ли она. Если вам не нужны номера строк, вы можете опустить эту опцию.Rscript myMainScript.R
. Это запускает новый неинтерактивный сеанс R и запускает сценарийmyMainScript.R
. Фрагмент кода, приведенный на шаге 1, который был помещен в начало,myMainScript.R
устанавливает параметр обработки ошибок для неинтерактивного сеанса R.myMainScript.R
. Это может быть в самом основном скрипте или вложено в несколько функций глубоко. При обнаружении ошибки обработка будет выполняться, как указано в шаге 1, и сеанс R завершится.errorDump.rda
и и журнал ошибок с именемerror.log
создаются в каталоге, указанном'~/myUsername/directoryForDump'
параметром глобальной обработки ошибок.На досуге
error.log
просмотрите информацию об ошибке, включая само сообщение об ошибке и полную трассировку стека, ведущую к ошибке. Вот пример журнала, созданного при ошибке; обратите внимание, что числа после#
символа - это номера строк ошибки в различных точках стека вызовов:На досуге вы можете загрузить
errorDump.rda
в интерактивный сеанс R, используяload('~/path/to/errorDump.rda')
. После загрузки вызовитеdebugger(errorDump)
для просмотра всех объектов R в памяти в любой из активных сред. Дляdebugger()
получения дополнительной информации см. Справку по R.Этот рабочий процесс чрезвычайно полезен при запуске R в некоторой производственной среде, где у вас есть неинтерактивные сеансы R, инициируемые из командной строки, и вы хотите, чтобы информация о неожиданных ошибках сохранялась. Возможность делать дамп памяти в файл, который вы можете использовать для проверки рабочей памяти во время ошибки, наряду с номерами строк ошибки в стеке вызовов, облегчает быструю посмертную отладку причины ошибки.
источник
Сначала,
options(show.error.locations = TRUE)
а потомtraceback()
. Номер строки ошибки будет отображаться после #источник