2010-06-10 4 views
16

È disponibile uno strumento (editor, script, qualunque ...) che possa riformattare automaticamente il codice R? Non ha bisogno di essere personalizzabile, ma deve essere in grado di riconoscere istruzioni separate da punto e virgola o da una nuova riga poiché questo codice ha entrambi. Se è in grado di mettere tutte le istruzioni su una linea separata, riordinare coerentemente i blocchi di codice e posizionare coerentemente le parentesi sarò molto felice.per auto-formattare il codice R

Modifica: che riassume i risultati

Grazie per le grandi risposte. Ecco cosa ho trovato.

  • Sia ESS che StatET sono ottimi editor R e fanno un buon lavoro di rientro automatico dei blocchi di codice. StatET ti consente di selezionare-tutto e ri-indentare tutto in un file in una sola volta. Da quello che ho potuto dire ESS ti permette di rientare un'intera funzione def in una sola volta ma non l'intero file (correggimi se l'ho perso). Nessuno di questi aggiusterà il posizionamento del controvento o spezzerà le linee multi-statement. (Es: i = n * b; a = i + 1)
  • formatR è fantastico. Oltre a correggere i rientri, posiziona le parentesi in modo coerente e suddivide le linee multi-statement.

Ecco una piccola funzione che ho scritto in modo da poter convertire un'intera directory di origine (utilizzando la stessa funzione di base di formatR che è stranamente nel pacchetto di animazione).

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

Scrivo "codice carino" dall'inizio perché lo trovo più facile da leggere. Io uso il plugin StatET per Eclipse (ho provato ESS ma lo trovo paragonabile a StatET) che è perfettamente soddisfacente per la mia linea di lavoro. –

+0

@romunov si, sono d'accordo ma la maggior parte del codice R che devo modificare non è stata inizialmente creata da me – Keith

+0

Keith, buon punto. In tal caso, trovo formatR come un'opzione eccellente (come hai già scoperto). –

risposta

9

Sebbene ESS sia una soluzione a lungo termine molto migliore, se si ha solo un lavoro di formattazione veloce, forse questo pacchetto sarà d'aiuto: http://yihui.name/en/?s=formatr.

7

Emacs con ESS fa estremamente bene - le impostazioni predefinite ei come raccomandato da R core sono in Section 7 R coding standards del manuale R Internals.

+0

Come si fa in ess? – qed

+1

http://ess.r-project.org/Manual/ess.html#Indenting –

+0

Grande. Si tratta di stili di codice impostati. Se il codice è un po 'disordinato, c'è un comando per pulire il formato? – qed

6

Io uso StatET e funziona abbastanza bene per questo.

Si potrebbe anche provare the formatR package su CRAN.

+1

Come si fa in StatET, per favore? Non ho potuto trovare l'opzione per questo. – qed

0

È possibile utilizzare ctrl + I in statET per correggere il rientro del codice. Tuttavia è possibile utilizzare il pacchetto formatR con frammenti di codice che generano risultati migliori, in particolare assegnando un tasto di scelta rapida.