инструмент для автоматического форматирования кода R - PullRequest
16 голосов
/ 10 июня 2010

Существует ли какой-либо инструмент (редактор, скрипт, что угодно ...), который может автоматически переформатировать код R? Его не нужно настраивать, но он должен распознавать операторы, разделенные точками с запятой или символом новой строки, поскольку в этом коде есть и то, и другое. Если он сможет поместить все операторы в отдельную строку, последовательно сделать отступы для блоков кода и последовательно разместить скобки, я буду очень счастлив.

Редактировать: обобщение результатов

Спасибо за отличные ответы. Вот что я нашел.

  • И ESS, и StatET являются отличными редакторами R и отлично справляются с автоматическим отступом блоков кода. StatET позволяет вам выбрать все и заново сделать отступ в файле. Судя по тому, что я могу сказать, ESS позволяет сразу делать отступ для всей функции def, но не для всего файла (пожалуйста, исправьте меня, если я его пропустил). Ни один из них не исправит расстановку скобок и не нарушит строки с несколькими утверждениями. (Например: i = n * b; a = i + 1)
  • formatR потрясающий. В дополнение к исправлению отступа он также будет последовательно размещать фигурные скобки и разбивать строки из нескольких операторов.

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

library("animation")

tidy.all <- function(inDir = NULL, outDir = NULL, ...) {
    if (is.null(inDir) || is.na(outDir)) 
        stop("inDir can't be null or NA")
    if (!file.info(inDir)$isdir) 
        stop("inDir must be a directory")

    if (is.null(outDir) || is.na(outDir)) 
        stop("outDir can't be null or NA")
    if (!file.exists(outDir)) 
        dir.create(outDir)
    if (!file.info(outDir)$isdir) 
        stop("outDir must be a directory")

    for (f in dir(inDir)) {
        currFile <- file.path(inDir, f)
        if (length(grep(".*\\.R$", currFile, perl = T))) {
            outFile <- file.path(outDir, f)
            if (file.exists(outFile)) 
                stop(paste("refusing to overwrite", outFile))

            tidy.source(currFile, file = outFile, ...)
        }
    }
}

Ответы [ 5 ]

9 голосов
/ 11 июня 2010

Хотя ESS является гораздо лучшим долгосрочным решением, если у вас есть просто быстрое форматирование, возможно, этот пакет поможет: http://yihui.name/en/?s=formatr.

7 голосов
/ 11 июня 2010

Emacs с ESS делает это очень хорошо - и настройки по умолчанию, рекомендованные R Core, содержатся в Раздел 7 Стандарты кодирования R из R Internals инструкция.

6 голосов
/ 11 июня 2010

Я использую StatET , и для этого он достаточно хорошо работает.

Вы также можете попробовать пакет formatR на CRAN.

2 голосов
/ 10 июня 2010

Хотя я никогда не использовал его, возможно, следующий плагин Eclipse http://www.walware.de/it/statet/ может помочь.

0 голосов
/ 13 июня 2014

Вы можете использовать Ctrl + I в statET, чтобы исправить отступ вашего кода. Однако можно использовать пакет formatR с фрагментами кода, которые генерируют лучший результат, особенно путем назначения ему горячей клавиши.

...