2010-06-10 21 views
16

¿Hay alguna herramienta (editor, script, lo que sea ...) disponible que pueda reformatear automáticamente el código R? No necesita ser personalizable, pero debe poder reconocer las declaraciones separadas por punto y coma o líneas nuevas, ya que este código tiene ambas. Si puede poner todas las declaraciones en una línea separada, sangrar bloques de código consistentemente y colocar llaves de forma consistente, estaré muy feliz.herramienta para formatear automáticamente el código R

Editar: resume las conclusiones

gracias por los grandes respuestas. Esto es lo que he encontrado.

  • Tanto ESS como StatET son excelentes editores de R y hacen un buen trabajo al autodetectar bloques de código. StatET le permite seleccionar todo y volver a sangrar todo en un archivo a la vez. Por lo que pude decir, ESS le permite sangrar una definición de función completa de una vez, pero no el archivo completo (corríjase si me lo perdí). Ninguno de estos arregla la colocación de la abrazadera ni divide las líneas de las declaraciones múltiples. (Por ejemplo: i = n * b; a = i + 1)
  • formatR es impresionante. Además de corregir la indentación, también colocará llaves de forma consistente y dividirá líneas de instrucciones múltiples.

Aquí hay una pequeña función que escribí para poder convertir un directorio de origen completo (usando la misma función subyacente que formatR que está extrañamente en el paquete de animación).

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

Escribo "código bonito" desde el principio porque me resulta más fácil de leer. Utilizo el plugin StatET para Eclipse (lo he intentado con ESS, pero me parece comparable con StatET), que es perfectamente satisfactorio para mi línea de trabajo. –

+0

@romunov sí, estoy de acuerdo, pero la mayor parte del código R que tengo que modificar no fue creado inicialmente por mí – Keith

+0

Keith, buen punto. En ese caso, considero que el formato R es una excelente opción (como ya ha descubierto). –

Respuesta

7

Emacs con ESS lo hace extremadamente bien - configuración y el valor predeterminado según lo recomendado por R Core se encuentran en el manual de Section 7 R coding standardsR Internals.

+0

¿Cómo lo haces en ess? – qed

+1

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

+0

Genial. Se trata de establecer estilos de código. Si el código está algo desordenado, ¿hay algún comando para limpiar el formato? – qed

6

Uso StatET, y funciona bastante bien para esto.

También puede probar the formatR package en CRAN.

+1

¿Cómo lo haces en StatET, por favor? No pude encontrar la opción para eso. – qed

0

Puede usar ctrl + I en statET para corregir la sangría de su código. Sin embargo, es posible utilizar el paquete formatR con fragmentos de código que generan mejores resultados, especialmente al asignarle una tecla de acceso directo.

Cuestiones relacionadas