Вопрос
Как отладить Rscripts
, которые запускаются из командной строки? Р>
В настоящее время я использую пакет getopt
для передачи параметров командной строки, но в случае ошибки мне сложно:
R
(поскольку скрипт ожидает параметры командной строки.) У кого-нибудь есть пример кода и он готов поделиться? Р>
Решение
Вы можете передать аргументы командной строки в интерактивную оболочку с помощью --args, а затем получить исходный текст ('') сценария.
$ R --args -v
R version 2.8.1 (2008-12-22)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> require(getopt)
Loading required package: getopt
> opt = getopt(c(
+ 'verbose', 'v', 2, "integer"
+ ));
> opt
$verbose
[1] 1
> source('my_script.R')
Теперь вы можете использовать старую функцию browser () для отладки.
Другие советы
Я использую печатные заявления старой школы или интерактивный анализ. Для этого я сначала сохраняю состояние с помощью save ()
, а затем загружаю его в интерактивный сеанс (для которого я использую Emacs / ESS). Это позволяет интерактивно работать с использованием кода скрипта построчно.
Но я часто пишу / тестирую / отлаживаю код в интерактивном режиме, прежде чем развернуть его в более мелком сценарии.
Другой вариант - работать с опциями (ошибками). Вот простой пример:
options(error = quote({dump.frames(to.file=TRUE); q()}))
Вы можете создать настолько сложный сценарий, сколько захотите, в случае ошибки, поэтому вам просто нужно решить, какая информация вам нужна для отладки.
В противном случае, если есть определенные области, которые вас беспокоят (например, подключение к базе данных), оберните их в функцию tryCatch ().