自动格式化R代码的工具

18
有没有可以自动重新格式化R代码的工具(编辑器、脚本或其他...)可用?它不需要是可定制的,但必须能够识别由分号或换行符分隔的语句,因为此代码两者都有。如果它可以将所有语句放在单独的一行上,一致地缩进代码块,并一致地放置大括号,我会非常高兴。
编辑:总结结果
感谢大家的回答。以下是我的发现。
- ESS和StatET都是很好的R编辑器,可以很好地自动缩进代码块。 StatET允许您选择全部并一次性重新缩进文件中的所有内容。据我所知,ESS允许您一次缩进整个函数定义,但不能缩进整个文件(如果我错了,请纠正我)。这两种方法都无法修复大括号的位置或分割多语句行。(例如:i = n*b; a=i+1) - formatR很棒。除了修复缩进外,它还会一致地放置大括号并拆分多语句行。
以下是我编写的一个小函数,以便我可以转换整个源目录(使用与formatR相同的基础函数,该函数奇怪地位于animation包中)。
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, ...)
        }
    }
}

1
我从一开始就编写"漂亮的代码",因为我觉得这样更容易阅读。我使用Eclipse 的StatET插件(我已经尝试过ESS,但我发现它与StatET相比差不多),这对我来说完全满足我的工作需求。 - Roman Luštrik
@romunov 是的,我同意,但我需要修改的大部分 R 代码最初并不是由我创建的。 - Keith
Keith,说得好。在这种情况下,我发现formatR是一个很好的选择(正如你已经发现的那样)。 - Roman Luštrik
JGR 也可以进行代码格式化。 - Ian Fellows
6个回答

9

虽然ESS是更好的长期解决方案,但如果您只需要快速格式化作业,则此软件包可能会有所帮助:http://yihui.name/en/?s=formatr


7

你如何在ess中实现它? - qed
好的。这些都是关于代码风格设置的。如果代码有点乱,是否有命令可以清理格式? - qed
1
除非我弄错了,ESS 只处理缩进问题,而不涉及其他代码风格问题,如花括号放在哪一行、注释符号前有多少空格、运算符周围是否要加空格、使用 = 还是 <- 等等。 - Ken Williams

6
我使用 StatET,对于这个问题它运行得非常好。
你也可以尝试在CRAN上使用formatR包

1
请问在StatET中如何做到这一点?我找不到选项。 - qed

2

0

你可以在statET中使用ctrl + I来修正代码的缩进。 然而,使用formatR包与代码片段生成更好的结果是可能的,特别是通过为其分配热键。


-1

我也曾遇到同样的问题。 在 R Studio 中重新格式化有一个非常简单的方法: 只需复制您的所有代码,然后粘贴到一个新的 R 脚本 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接