Подтвердить что ты не робот

Какие основные пакеты должны иметь профессиональный разработчик R и почему?

Каковы конкретные утилиты, которые могут помочь R-разработчикам координировать и отлаживать более эффективно?

Я хочу создать среду разработки R и хотел бы ознакомиться с инструментами, которые были бы полезны мне при разработке инфраструктуры тестирования модулей с охватом кода, отладкой, созданием файлов пакетов и файлов справки и, возможно, UML-моделирование.

Примечание.. Пожалуйста, объясните свои ответы по причинам и примерам, основываясь на вашем опыте с инструментами, которые вы рекомендуете. Не просто ссылку.

Связанные

4b9b3361

Ответ 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