17

是否有任何工具(编辑器、脚本等)可以自动重新格式化 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, ...)
        }
    }
}
4

6 回答 6

9

虽然 ESS 是一个更好的长期解决方案,但如果您只是有一个快速的格式化工作,也许这个包会有所帮助:http://yihui.name/en/ ?s= formatr

于 2010-06-10T20:21:43.870 回答
7

带有 ESS 的 Emacs 做得非常好——R Core 推荐的默认设置在R Internals手册的第 7 节R 编码标准中。

于 2010-06-10T20:11:00.487 回答
6

我使用StatET,它对此非常有效。

你也可以试试CRAN 上的 formatR 包

于 2010-06-10T20:22:26.700 回答
2

虽然我从未使用过它,但也许下面的 eclipse 插件 http://www.walware.de/it/statet/可能会有所帮助。

于 2010-06-10T19:55:28.747 回答
0

您可以在 statET 中使用 ctrl + I 来修复代码的缩进。但是,可以将 formatR 包与代码片段一起使用,尤其是通过为其分配热键来生成更好的结果。

于 2014-06-13T09:06:57.090 回答
-1

我有同样的问题。在 R Studio 中重新格式化有一种非常简单的方法:只需复制所有代码并粘贴到新的R script

于 2019-07-24T19:04:41.420 回答