2011-11-09 24 views
7

Digamos que tengo un archivo .Rnw que contiene la LaTex habitual mezclada con fragmentos de código R. (Estoy especialmente interesado en convertir un documento de diapositivas .Rnw, pero esta pregunta se aplica a cualquier documento .Rnw). Ahora quiero convertir esto a un archivo que contiene todo el código R, más todo el texto que normalmente sería generado por LaTex, como R comentarios. En otras palabras, la funcionalidad que deseo es similar a lo que hace Stangle(), pero también quiero que toda la parte de texto de LaTex se convierta en texto sin formato que está comentado en el archivo .R resultante.Sweave, R, Beamer: ¿Cómo convertir el texto de LaTex en un archivo Rnw a los comentarios de R?

Esta sería una forma muy conveniente de generar automáticamente un archivo R comentado que sea fácil de ver en su editor de resaltado de sintaxis favorito (por ejemplo, emacs). Puede que esto no suene como una gran idea para un documento Sweave que es un artículo largo con solo un poco de código R, pero comienza a verse atractivo cuando el documento .Rnw es en realidad una presentación de diapositivas (por ejemplo, usando beamer) - entonces la porción de texto de las diapositivas haría comentarios perfectos para el código R.

¿Alguien tiene alguna idea sobre cómo hacer esto? Gracias por adelantado.

Respuesta

8

Aquí hay un enfoque que usa regex. Todavía quedan algunos problemas, y mantendré una lista que se actualizará con las resoluciones.

# READ LINES FROM RNW FILE 
lines <- readLines('http://users.stat.umn.edu/~charlie/Sweave/foo.Rnw') 

# DETECT CODE LINES USING SWEAVE CHUNK DEFINITIONS 
start_chunk <- grep("^<<.*=$", lines) 
end_chunk <- grep("^@" , lines) 
r_lines  <- unlist(mapply(seq, start_chunk + 1, end_chunk - 1)) 

# COMMENT OUT NON CODE LINES AND WRITE TO FILE 
lines[-r_lines] <- paste("##", lines[-r_lines]) 
writeLines(lines, con='codefile.R') 

cuestiones pendientes:

  1. no trata bien con trozos llamados dentro de otros trozos utilizando <<chunk_name>>
+0

Es posible que desee para definir expresiones regulares más compleja para reparar el trozo problema de nombres, como: '"^<<.*>> =? $ "' Para el fragmento de inicio. Pero es un enfoque muy ordenado, de todos modos ... buen uso de 'mapply'. – aL3xa

+0

Ese es un enfoque ordenado, y sí, buen uso de 'mapply'. Una cosa más que sería agradable es deshacerse de todas las marcas 'LaTeX' (cosas como' \ begin {frame} ',' \ frametitle', ...) para producir comentarios limpios y puramente textuales. Al menos, deshacerse de todas las palabras clave de LaTeX sería un comienzo. Supongo que se podría escribir un 'regex' para reemplazar todas las palabras reservadas de LaTeX con cadenas vacías. Eso sería un comienzo, pero espero que haya alguna forma de aprovechar el analizador LaTeX, y de alguna manera capturar el * texto * que el látex habría generado. –

+0

Combinando la idea de @ Ramnath con una de las soluciones LaTeX-a-texto de otra pregunta SO (http://stackoverflow.com/questions/530121/how-do-i-convert-latex-to-plain-text-ascii) puede conseguirme lo que quiero –

Cuestiones relacionadas