R строк строки сценария при ошибке?

Если я запускаю длинный R-скрипт из командной строки (R -slave script.R), как я могу заставить его указывать номера строк при ошибках?

Я не хочу добавлять команды отладки в сценарий, если это вообще возможно – я просто хочу, чтобы R вел себя как большинство других языков сценариев …

Это не даст вам номер строки, но он скажет вам, где происходит сбой в стеке вызовов, что очень полезно:

traceback() 

[Edit:] При запуске скрипта из командной строки вам придется пропустить один или два вызова, см. Traceback () для интерактивных и неинтерактивных сеансов R

Я не знаю другого способа сделать это без обычных подозреваемых отладки:

  1. отлаживать()
  2. браузер ()
  3. options (error = recover) [после чего опции (ошибка = NULL), чтобы вернуть его]

Возможно, вы захотите посмотреть на эту статью.

[Edit:] Извините … просто увидел, что вы запускаете это из командной строки. В этом случае я предлагаю работать с функциональными возможностями (ошибкой). Вот простой пример:

 options(error = quote({dump.frames(to.file=TRUE); q()})) 

Вы можете создать как сложный скрипт, как вы хотите, при условии ошибки, поэтому вам нужно просто решить, какую информацию вам нужно для отладки.

В противном случае, если есть определенные области, о которых вы беспокоитесь (например, подключение к базе данных), затем заверните их в функцию tryCatch ().

Выполнение options(error=traceback) предоставляет немного больше информации о содержании строк, ведущих к ошибке. Это приводит к тому, что traceback появляется, если есть ошибка, а для некоторых ошибок он имеет номер строки с префиксом # . Но это хит или промах, многие ошибки не получат номера строк.

Поддержка этого будет достигнута в R 2.10 и более поздних версиях. Дункан Мердок только что отправил в r-devel 10 сентября 2009 о findLineNum и setBreapoint :

 I've just added a couple of functions to R-devel to help with debugging. findLineNum() finds which line of which function corresponds to a particular line of source code; setBreakpoint() takes the output of findLineNum, and calls trace() to set a breakpoint there. These rely on having source reference debug information in the code. This is the default for code read by source(), but not for packages. To get the source references in package code, set the environment variable R_KEEP_PKG_SOURCE=yes, or within R, set options(keep.source.pkgs=TRUE), then install the package from source code. Read ?findLineNum for details on how to tell it to search within packages, rather than limiting the search to the global environment. For example, x <- " f <- function(a, b) { if (a > b) { a } else { b } }" eval(parse(text=x)) # Normally you'd use source() to read a file... findLineNum("#3") #  is a dummy filename used by parse(text=) This will print f step 2,3,2 in  and you can use setBreakpoint("#3") to set a breakpoint there. There are still some limitations (and probably bugs) in the code; I'll be fixing thos 

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

Как я уже настроил, обработка ошибок также создает файл RData, содержащий все объекты в рабочей памяти во время ошибки. Этот дамп можно прочитать в R с помощью load() а затем различные среды, которые существовали во время ошибки, могут быть проверены в интерактивном режиме с помощью debugger(errorDump) .

Отмечу, что мне удалось получить номера строк в traceback() из любых пользовательских функций в стеке, но только если я использовал параметр keep.source=TRUE при вызове source() для любых пользовательских функций, используемых в моем скрипте , Без этой опции установка глобальной функции обработки ошибок, как показано ниже, отправила полный вывод traceback() в журнал ошибок с именем error.log , но номера строк не были доступны.

Вот основные шаги, которые я предпринял в своем рабочем процессе и как я смог получить доступ к дампу памяти и журналу ошибок после неинтерактивного R-сбоя.

  1. Я поставил следующее в верхней части основного сценария, который я вызывал из командной строки. Это задает параметр глобальной обработки ошибок для сеанса R. Мой главный скрипт был вызван myMainScript.R . Различные строки в коде имеют комментарии после того, как они описывают, что они делают. В основном, с этой опцией, когда R встречает ошибку, которая запускает stop() , она создаст файл дампа RData (* .rda) рабочей памяти во всех активных средах в каталоге ~/myUsername/directoryForDump и также напишет ошибку log с именем error.log с некоторой полезной информацией в тот же каталог. Вы можете изменить этот fragment, чтобы добавить другую обработку при ошибке (например, добавить временную метку в файл дампа и имена файлов журнала ошибок и т. Д.).

     options(error = quote({ setwd('~/myUsername/directoryForDump'); # Set working directory where you want the dump to go, since dump.frames() doesn't seem to accept absolute file paths. dump.frames("errorDump", to.file=TRUE, include.GlobalEnv=TRUE); # First dump to file; this dump is not accessible by the R session. sink(file="error.log"); # Specify sink file to redirect all output. dump.frames(); # Dump again to be able to retrieve error message and write to error log; this dump is accessible by the R session since not dumped to file. cat(attr(last.dump,"error.message")); # Print error message to file, along with simplified stack trace. cat('\nTraceback:'); cat('\n'); traceback(2); # Print full traceback of function calls with all parameters. The 2 passed to traceback omits the outermost two function calls. sink(); q()})) 
  2. Убедитесь, что из главного сценария и любых последующих вызовов функций, в любое время, когда используется функция, используется опция keep.source=TRUE . То есть, чтобы выставить функцию, вы должны использовать source('~/path/to/myFunction.R', keep.source=TRUE) . Это необходимо для вывода traceback() чтобы содержать номера строк. Похоже, что вы также можете установить этот параметр глобально с помощью options( keep.source=TRUE ) , но я не тестировал это, чтобы увидеть, работает ли он. Если вам не нужны номера строк, вы можете опустить эту опцию.

  3. С терминала (за пределами R) вызовите основной сценарий в пакетном режиме с помощью Rscript myMainScript.R . Это запустит новый неинтерактивный сеанс R и запустит скрипт myMainScript.R . Фрагмент кода, указанный в шаге 1, который был помещен в начало myMainScript.R устанавливает параметр обработки ошибок для неинтерактивного сеанса R.
  4. myMainScript.R ошибку где-то внутри выполнения myMainScript.R . Это может быть в самом главном скрипте или глубоко вложить несколько функций. Когда ошибка встречается, обработка будет выполняться, как указано на шаге 1, и сеанс R завершится.
  5. Файл дампа RData с именем errorDump.rda и журнал ошибок с именем error.log создаются в каталоге, заданном '~/myUsername/directoryForDump' в настройке глобальной обработки ошибок.
  6. В свободное время проверите error.log чтобы просмотреть информацию об ошибке, включая само сообщение об ошибке и полную трассировку стека, ведущую к ошибке. Вот пример журнала, созданного при ошибке; обратите внимание на цифры после символа # – номера строк ошибки в разных точках стека вызовов:

     Error in callNonExistFunc() : could not find function "callNonExistFunc" Calls: test_multi_commodity_flow_cmd -> getExtendedConfigDF -> extendConfigDF Traceback: 3: extendConfigDF(info_df, data_dir = user_dir, dlevel = dlevel) at test_multi_commodity_flow.R#304 2: getExtendedConfigDF(config_file_path, out_dir, dlevel) at test_multi_commodity_flow.R#352 1: test_multi_commodity_flow_cmd(config_file_path = config_file_path, spot_file_path = spot_file_path, forward_file_path = forward_file_path, data_dir = "../", user_dir = "Output", sim_type = "spot", sim_scheme = "shape", sim_gran = "hourly", sim_adjust = "raw", nsim = 5, start_date = "2017-07-01", end_date = "2017-12-31", compute_averages = opt$compute_averages, compute_shapes = opt$compute_shapes, overwrite = opt$overwrite, nmonths = opt$nmonths, forward_regime = opt$fregime, ltfv_ratio = opt$ltfv_ratio, method = opt$method, dlevel = 0) 
  7. В свободное время вы можете загрузить errorDump.rda в интерактивный сеанс R с использованием load('~/path/to/errorDump.rda') . После загрузки вызовите debugger(errorDump) чтобы просмотреть все объекты R в памяти в любой из активных сред. Для получения дополнительной информации см. debugger() R на debugger() .

Этот рабочий процесс чрезвычайно полезен при запуске R в какой-либо производственной среде, в которой вы запускаете неинтерактивные R-сеансы в командной строке, и вам нужна информация о непредвиденных ошибках. Возможность сбрасывать память в файл, который вы можете использовать для проверки рабочей памяти во время ошибки, а также номера строк ошибки в стеке вызовов, облегчает быструю посмертную отладку того, что вызвало ошибку.

Вы это сделаете, установив

 options(show.error.locations = TRUE) 

Мне просто интересно, почему этот параметр не является значением по умолчанию в R? Это должно быть, как и на любом другом языке.

  • В настоящий момент точка останова не будет удалена. Для этого документа в приложении Silverlight не были загружены никакие символы
  • Windows (). Активировать работу на каждом компьютере, кроме одного
  • «В настоящий момент точка останова не будет удалена. Исходный код отличается от исходного. «Что это значит?
  • Не удалось подключиться к серверу ASP.Net Development Server
  • Отладка в Maven?
  • Как я могу отлаживать javascript на Android?
  • Использование Chrome, как найти, какие события связаны с элементом
  • Как отступить в отладчике Eclipse?
  • Как найти, где исключение было выбрано на C ++?
  • Как использовать условную точку останова в Eclipse?
  • Почему я не могу редактировать метод, содержащий анонимный метод в отладчике?
  • Давайте будем гением компьютера.