17

R コードを自動的に再フォーマットできるツール (エディター、スクリプトなど) はありますか? カスタマイズ可能である必要はありませんが、このコードにはセミコロンまたは改行の両方があるため、セミコロンまたは改行で区切られたステートメントを認識できる必要があります。すべてのステートメントを別の行に配置し、一貫してコード ブロックをインデントし、一貫して中括弧を配置できる場合、私は非常に満足しています。

編集:調査結果の要約

素晴らしい答えをありがとう。これが私が見つけたものです。

  • ESS と StatET はどちらも優れた R エディターであり、コード ブロックの自動インデントをうまく処理します。StatET を使用すると、ファイル内のすべてを一度に選択して再インデントできます。私が知る限り、ESS では関数定義全体を一度にインデントできますが、ファイル全体をインデントすることはできません (見逃した場合は訂正してください)。これらのどちらもブレースの配置を修正したり、複数ステートメントの行を分割したりしません。(例: 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

Emacs と ESS は非常にうまく機能します。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 に答える