Какие основные пакеты должны иметь профессиональный разработчик R и почему?
Каковы конкретные утилиты, которые могут помочь R-разработчикам координировать и отлаживать более эффективно?
Я хочу создать среду разработки R и хотел бы ознакомиться с инструментами, которые были бы полезны мне при разработке инфраструктуры тестирования модулей с охватом кода, отладкой, созданием файлов пакетов и файлов справки и, возможно, UML-моделирование.
Примечание.. Пожалуйста, объясните свои ответы по причинам и примерам, основываясь на вашем опыте с инструментами, которые вы рекомендуете. Не просто ссылку.
Связанные
Ответы
Ответ 1
Я написал слишком много пакетов, поэтому, чтобы держать вещи управляемыми, я вложил много времени в пакеты инфраструктуры: пакеты, которые помогают мне сделать мой код более надежным и облегчить его использование другими пользователями. К ним относятся:
-
roxygen2
(с Manuel Eugster и Peter Danenberg), который позволяет вам хранить документацию рядом с функцией, которую она выполняет, что делает ее гораздо более вероятной, я буду держать ее в курсе. roxygen2
также имеет ряд новых функций, предназначенных для минимизации дублирования документации: шаблоны (@template
), наследование параметров (@inheritParams
) и семейства функций (@family
), чтобы назвать несколько.
-
testthat
автоматизирует тестирование моего кода. Это становится все более и более важным, поскольку у меня все меньше и меньше времени на код: автоматические тесты помнят, как должна работать функция, даже когда я этого не делаю.
-
devtools
автоматизирует многие общие задачи разработки (как упоминал Андри). Конечная цель для devtools
заключается в том, чтобы она действовала как R CMD check
, которая непрерывно работает в фоновом режиме и уведомляет вас о том, что что-то пошло не так.
-
profr
, особенно неизданный интерактивный проводник, облегчает мне поиск узких мест в моем коде.
-
helpr
(с Barret Schloerke), который скоро будет power http://had.co.nz/ggplot2, предоставляет элегантный интерфейс html для документации R.
Полезные функции R:
-
apropos
: я всегда забываю имена полезных функций, а apropos
помогает мне найти их, даже если я помню только фрагмент
Вне R:
-
Я использую textmate для редактирования R (и других) файлов, но я не думаю, что это действительно важно. Выберите один и узнайте все его уголки и трещины.
-
Проведите некоторое время, чтобы изучить командную строку. Все, что вы можете сделать для автоматизации любой части вашего рабочего процесса, окупится в долгосрочной перспективе. Запуск R из командной строки приводит к естественному процессу, в котором каждый проект имеет свой экземпляр R; У меня часто есть 2-5 экземпляров R, работающих одновременно.
-
Используйте контроль версий. Мне нравится git
и github. Опять же, не имеет значения, какую именно систему вы используете, но осваивайте ее!
Вещи, которые я хотел бы иметь R:
- инструменты покрытия кода
- структура управления зависимостями, такая как rake или jake
- лучшие инструменты профилирования памяти
- стандарт метаданных для описания кадров данных (и других источников данных)
- лучшие инструменты для описания и рендеринга таблиц в различных форматах вывода
- пакет для рендеринга уценки
Ответ 2
Как я помню, это было задано раньше, и мой ответ остается тем же: Emacs.
Emacs может
- сделайте все, что вы хотите сделать с помощью R ESS, включая
- выполнение кода различных фрагментов (строка, область, функция, буфер,...)
- проверка рабочих областей,
- отображение переменных,
- несколько сеансов R и простое переключение между ними
- режим транскрипции для повторного запуска (части) предыдущих сеансов
- доступ к справочной системе
- и многое другое
- обрабатывает латекс с аналогичной легкостью через режим AucTex, который помогает Sweave для R
- имеет режимы для любых других языков программирования, которые вы комбинируете с R, будь то C/С++, Python, shell, SQL,... покрытие автоматического выделения и выделения цвета
- может обращаться к базам данных с помощью sql- * mode
- может работать удаленно с помощью режима tramp: доступ к удаленным файлам, как если бы они были локальными (использует ssh/scp)
- может запускаться как демон, который делает его работоспособным, чтобы вы могли повторно подключиться к тому же сеансу Emacs, будь то на рабочей станции под X11 (или эквивалентом) или удаленно через ssh (с или без X11) или на экране.
- имеет org-mode, который вместе с babel предоставляет мощную альтернативу sweave, как обсуждалось в этой статье обсуждаются приложения рабочего процесса для (социальных) ученых.
- может запускать оболочку через
M-x shell
и/или M-x eshell
, имеет хорошие функции доступа к каталогам в режиме ожидания, имеет режим ssh для удаленного доступа.
- с легкостью связывает все репозитории исходного кода с помощью определенных режимов (например, psvn для svn)
- является кросс-платформенной, как и R, поэтому у вас есть аналогичный опыт взаимодействия с пользователем во всех соответствующих операционных системах.
- широко используется, широко доступен и активно развивается как для кода, так и для расширений, см. сайт emacswiki.org для последнего
-
<tongueInCheek>
не является Eclipse и не требует Java </tongueInCheek>
Вы можете, конечно, объединить его с любыми пакетами CRAN, которые вам нравятся: RUnit или testthat, различные пакеты поддержки профилирования, пакет отладки,...
Дополнительные полезные инструменты:
-
R CMD check
действительно ваш друг, так как это CRAN использует, чтобы решить, находитесь ли вы "в или из"; использовать его и доверять ему
- Каталог
tests/
может предложить упрощенную версию модульных тестов, сохраняя сравнение с результатами (начиная с предшествующего прогона R CMD check
), это полезно, но правильные модульные тесты лучше
- особенно для пакетов с объектным кодом, я предпочитаю запускать новые сеансы R и littler упрощает:
r -lfoo -e'bar(1, "ab")'
запускает R session, загружает пакет foo
и оценивает данное выражение (здесь функция bar()
с двумя аргументами). Это, в сочетании с R CMD INSTALL
, обеспечивает полный цикл тестирования.
Ответ 3
Знание и возможность использования основных средств отладки R - важный первый шаг в обучении быстрому отладке кода R. Если вы знаете, как использовать базовые инструменты, вы можете отлаживать код везде, не требуя дополнительных инструментов, предоставляемых в дополнительных пакетах.
traceback()
позволяет увидеть стек вызовов, приводящий к ошибке
foo <- function(x) {
d <- bar(x)
x[1]
}
bar <- function(x) {
stopifnot(is.matrix(x))
dim(x)
}
foo(1:10)
traceback()
дает:
> foo(1:10)
Error: is.matrix(x) is not TRUE
> traceback()
4: stop(paste(ch, " is not ", if (length(r) > 1L) "all ", "TRUE",
sep = ""), call. = FALSE)
3: stopifnot(is.matrix(x))
2: bar(x)
1: foo(1:10)
Итак, мы можем ясно видеть, что ошибка произошла в функции bar()
; мы сузили масштаб поиска ошибок. Но что, если код генерирует предупреждения, а не ошибки? Это можно обработать путем включения предупреждений в ошибки с помощью опции warn
:
options(warn = 2)
превратит предупреждения в ошибки. Затем вы можете использовать traceback()
для их отслеживания.
Связано с этим, чтобы получить R для восстановления после ошибки в коде, чтобы вы могли отлаживать то, что пошло не так. options(error = recover)
выводит нас в кадр отладчика всякий раз, когда возникает ошибка:
> options(error = recover)
> foo(1:10)
Error: is.matrix(x) is not TRUE
Enter a frame number, or 0 to exit
1: foo(1:10)
2: bar(x)
3: stopifnot(is.matrix(x))
Selection: 2
Called from: bar(x)
Browse[1]> x
[1] 1 2 3 4 5 6 7 8 9 10
Browse[1]> is.matrix(x)
[1] FALSE
Вы видите, что мы можем попасть в каждый фрейм в стеке вызовов и посмотреть, как вызывались функции, какие аргументы и т.д. В приведенном выше примере мы видим, что bar()
был передан вектор, а не матрица, ошибка. options(error = NULL)
сбрасывает это поведение в нормальное состояние.
Другая ключевая функция - trace()
, которая позволяет вставлять отладочные вызовы в существующую функцию. Преимущество этого в том, что вы можете сказать R для отладки от конкретной строки в источнике:
> x <- 1:10; y <- rnorm(10)
> trace(lm, tracer = browser, at = 10) ## debug from line 10 of the source
Tracing function "lm" in package "stats"
[1] "lm"
> lm(y ~ x)
Tracing lm(y ~ x) step 10
Called from: eval(expr, envir, enclos)
Browse[1]> n ## must press n <return> to get the next line step
debug: mf <- eval(mf, parent.frame())
Browse[2]>
debug: if (method == "model.frame") return(mf) else if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'",
method), domain = NA)
Browse[2]>
debug: if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'",
method), domain = NA)
Browse[2]>
debug: NULL
Browse[2]> Q
> untrace(lm)
Untracing function "lm" in package "stats"
Это позволяет вам вставлять отладочные вызовы в нужную точку кода без необходимости выполнять вызовы исходящих функций.
Если вы хотите выполнить функцию по мере ее выполнения, то debug(foo)
включит отладчик для функции foo()
, а undebug(foo)
отключит отладчик.
Ключевым моментом в этих параметрах является то, что мне не нужно было изменять/редактировать любой исходный код, чтобы вставлять вызовы отладки и т.д. Я могу попробовать и посмотреть, что проблема непосредственно из сеанса, где произошла ошибка.
Для другого подхода к отладке в R см. раздел "Отметить Bravington" debug пакет на CRAN