Существует ли какой-либо инструмент (редактор, скрипт, что угодно ...), который может автоматически переформатировать код 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, ...)
}
}
}