usar - ¿Cómo capturar el texto R+la salida de la imagen en un archivo(html, doc, pdf, etc.)?
r sweave manual (11)
La tarea es crear un archivo (word, rtf, pdf, html o lo que sea) que capture la salida de R (por ejemplo, no el código que creó la salida), en ese formato (incluyendo texto e imágenes).
La forma de hacerlo debería implicar el menor cambio posible en la secuencia de comandos R original.
Si solo me importara el texto o las imágenes, usaría? Sink, o? Pdf. Pero no sé cómo combinar los dos en una salida de una manera fácil.
Sé que hay una manera de exportar la salida R usando r2wd , pero para mi gusto implica demasiada medalla en el código original (me imagino que lo mismo es cierto para la solución de sweave, aunque no tengo experiencia para decirlo)
Aquí hay un código de ejemplo para ejemplos futuros:
START.text.and.image.recording("output.file") # this is the function I am looking for
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
STOP.text.and.image.recording("output.file") # this is the function I am looking for
Actualización : se me preguntó de manera no Sweave u otras opciones desde la vista de tarea ReproducibleResearch .
Las razones son:
- No sé (todavía) LaTeX
- Incluso conociendo LaTeX, quiero algo con valores predeterminados simples para simplemente volcar todas las salidas juntas y en orden. "simplemente" significa - la menor sobrecarga de gestión de código / archivo extra posible.
Entiendo que algo como sweave o brew es más escalable, pero estoy buscando para ver si hay una solución más "simple" para proyectos / scripts más pequeños.
A partir de 2012, knitr
ofrece una solución perfecta para este problema.
Por ejemplo, cree un archivo con una extensión rmd. Envuelva su código en un par de comandos de la siguiente manera:
```{r}
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
plot(x,y)
print(summary(lm(y~x)))
```
Puede convertirlo en un archivo HTML autónomo de varias maneras. En RStudio solo presionas un solo botón Knit HTML
. Este es el archivo HTML producido ; para ver realmente cómo se muestra el HTML en un navegador, guarde el archivo y ábralo.
El código de las imágenes y la salida se entrelazan como se podría esperar.
Por supuesto, usted puede y normalmente dividiría su archivo en múltiples trozos de código R. Pero el punto es que no tienes que hacerlo.
Aquí hay otro par de ejemplos que he creado:
A través de las maravillas de Twitter, alguien se acercó y me envió un enlace a esta página , en relación con un paquete llamado "roux". Fue creado hace un año y nunca he oído hablar de él (aparentemente ninguno de los dos lo tiene).
Este paquete parece hacer exactamente lo que estaba buscando en mi pregunta, aunque la instalación no parece trivial.
Espero jugar con esta solución y también para ver si otros miembros de R pueden participar en este proyecto para mejorar R.
Bueno, solo recuerdo que estaba usando Asciidoc para informes cortos o para editar una página web. Ahora hay un complemento R ( ascii en CRAN), que permite incrustar el código R en un documento asciidoc. La sintaxis es bastante similar a Markdown o Textile, por lo que la aprenderás muy rápido.
Los resultados son (X) HTML, Docbook, LaTeX y, por supuesto, PDF a través de uno de los dos últimos backends.
Desafortunadamente, no creo que puedas envolver todo tu código en una sola declaración. Sin embargo, admite una gran cantidad de objetos R, ver más abajo.
> methods(ascii)
[1] ascii.anova* ascii.aov* ascii.aovlist* ascii.cast_df*
[5] ascii.character* ascii.coxph* ascii.CrossTable* ascii.data.frame*
[9] ascii.default* ascii.density* ascii.describe* ascii.describe.single*
[13] ascii.factor* ascii.freqtable* ascii.ftable* ascii.glm*
[17] ascii.htest* ascii.integer* ascii.list* ascii.lm*
[21] ascii.matrix* ascii.meanscomp* ascii.numeric* ascii.packageDescription*
[25] ascii.prcomp* ascii.sessionInfo* ascii.simple.list* ascii.smooth.spline*
[29] ascii.summary.aov* ascii.summary.aovlist* ascii.summary.glm* ascii.summary.lm*
[33] ascii.summary.prcomp* ascii.summary.survfit* ascii.summary.table* ascii.survdiff*
[37] ascii.survfit* ascii.table* ascii.ts* ascii.zoo*
Non-visible functions are asterisked
Escribí un guión llamado Roux hace aproximadamente un año que hace esto. Quería poder crear transcripciones HTML desde la ejecución de un script R, incluidas las imágenes, sin tener que cambiar el script.
Llamas a Roux desde la línea de comandos, así: roux example.R
y Roux:
- ejecutar el script en R (requiriendo el paquete Roux primero automáticamente)
- la sintaxis resalta la salida .Rout usando Pygments
- insertar imágenes en la ubicación correcta
El paquete Roux R es un paquete R muy pequeño que modifica plot () y algunas otras funciones para escribir automáticamente en un nombre de archivo aleatorio en lugar del dispositivo gráfico interactivo predeterminado.
Lo he usado mucho y me funciona muy bien, aunque estoy seguro de que si más personas lo usan con paquetes nuevos, surgirán problemas menores, lo más probable es que tenga una función diferente que genere una gráfica y Roux. no sabrá que debería abrir un dispositivo PNG para usted.
Desde que hablé con Tal sobre esto, he actualizado y mejorado el código, y ahora está aquí: http://bitbucket.org/ananelson/roux/src
por lo tanto, si tiene algún problema, infórmelo en el rastreador de problemas que se encuentra allí en Bitbucket.
He agregado soporte para las transcripciones de LaTeX para que pueda crear fácilmente archivos PDF que tengan la transcripción de su script R, incluidas las imágenes. (Puedes ver un ejemplo si miras en el directorio de salida de ejemplo, encuentra el enlace "sin procesar" para descargarlo).
Necesita tener Python y la biblioteca de Python de Pygments en su instalación. Si tiene una versión anterior de Python y tiene algún problema, hágamelo saber.
Escribí sobre Roux en mi blog, pero no lo publiqué mucho porque mis esfuerzos se han centrado en un nuevo proyecto llamado Dexy que pretende ser un reemplazo para Sweave. Si desea más flexibilidad y control, o si está interesado en la documentación que sabe leer y escribir, puede que también quiera revisar Dexy.
Esto es a la luz de la respuesta de romunov, pero aún así. Simplemente puede escribir su propia impresión que envuelva la salida en algún formato HTML e incruste la salida en un archivo HTML. Lo mismo se puede hacer con imágenes con el esquema URI de datos , por ejemplo, utilizando la función img
del paquete base64
R.
Le animaría a usar Sweave, pero se puede lograr una funcionalidad rudimentaria que no es bonita con sink()
.
Un archivo de texto regular:
sink(file = "test.txt", type = "output")
summary(cars)
sink()
o agregar algunas etiquetas HTML:
sink(file = "tal_test.html", type = "output")
cat("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01//EN/"", "/n")
cat("/"http://www.w3.org/TR/html4/strict.dtd/">", "/n")
cat("<HTML>", "/n")
cat("<HEAD>", "/n")
cat("<TITLE>My first HTML document</TITLE>", "/n")
cat("</HEAD>", "/n")
cat("<BODY>", "/n")
summary(cars)
cat("</BODY>", "/n")
cat("</HTML>", "/n")
sink()
Puede usar el paquete R2HTML
para enviar una sesión a html y existen algunas funciones similares en el paquete TeachingDemos
(vea txtStart
) para enviar texto y palabras mejoradas (a través de R2wd
). Los comandos que no sean gráficos se incluirán en el archivo automáticamente y la trama actual se puede insertar con un solo comando.
Si conoces a LaTeX, sweave probablemente sea tu mejor apuesta. odfWeave es un mecanismo similar pero para incrustar el código en un archivo OpenOffice.org. Para HTML existe el paquete R2html. Pero es probable que todos requieran que usted divida un poco el código para obtener lo mejor de los sistemas. Alternativamente, su plantilla sweave / odfweave / html podría generar los aspectos de generación de datos de la secuencia de comandos en un solo fragmento de código, con la pantalla de salida print()
instrucciones print()
) colocada donde sea necesario. También se puede llamar a sus gráficos dentro de la secuencia de comandos para producir las figuras que se insertarán en el documento como archivos separados, que luego incluirá a mano en la plantilla.
Por ejemplo (y este no es un archivo .Rnw
completo para ejecutarse a través de sweave
) en un archivo de sweave que pondría algo así en la plantilla que genera la parte principal del script R que hará el análisis y generará los objetos R:
<<run_script, eval=TRUE, echo=FALSE, results=hide>>=
source("my_script.R")
@
Luego deberá insertar los fragmentos de código donde desee imprimir el resultado:
<<disp_output, eval=TRUE, echo=FALSE, results=verbatim>>=
## The results=verbatim is redundant as it is the default, as is eval=TRUE
print(summary(x)) ## etc
@
Luego necesitarás trozos para insertar las figuras.
Separar su código de análisis de la salida (impresa y / o en cifras) es probablemente también una buena práctica, especialmente si el código de análisis es costoso en términos de cálculo. Puede ejecutarlo una vez, o incluso almacenarlo en la memoria caché, al mismo tiempo que actualiza el código de salida / visualización según sea necesario.
Ejemplo de archivo de sweave
Usando el archivo sweave de ejemplo de csgillespie, configuraría las cosas así. Primero, el archivo my_script.R
que contiene el código de análisis central:
x <- rnorm(100)
y <- jitter(x)
corXY <- cor(x,y)
mod.lm <- lm(y~x)
Luego el archivo Sweave
/documentclass[12pt]{article}
/usepackage{Sweave}
/begin{document}
An introduction
<<run_analysis, eval=TRUE,echo=FALSE, results=hide>>=
source("my_script.R")
@
% Later
Here are the results of the analysis
<<show_printed_output, echo=FALSE>>=
summary(x))
head(data.frame(x,y))
@
The correlation between /texttt{x} and /texttt{y} is:
<<print_cor, echo=FALSE>>=
corXY
@
Now a plot
/begin{figure}[h]
/centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@
/caption{/textit{A nice plot.}}
/end{figure}
/end{document}
Lo que pareces querer no existe; una forma sencilla de combinar el código R y la salida en un archivo de documento. Eso es si no consideras sweave y es simple. Es posible que deba replantearse lo que desea hacer o la forma en que organiza su análisis, gráficos y código de salida, pero es probable que le sirvan mejor mirando una de las opciones sugeridas (sweave, odfweave, brew, R2html).
HTH
También está LyX, que tiene una interfaz de Sweave. El código de la interfaz R / LyX / Sweave está en CRAN en http://cran.fhcrc.org/contrib/extra/lyx/ . LyX está en la mayoría de las distribuciones de Linux. Toda esta magia se puede hacer que funcione en Windows, pero definitivamente no es trivial. En Windows, recomendaría Inference for R de Blue Reference para el programa de alfabetización R.
Usted mencionó sweave en su pregunta, pero no realmente por qué no es adecuado. Tu pregunta parece perfecta para Sweave. De hecho, su código de ejemplo podría provenir del segundo example Sweave.
Ejemplo de archivo de Sweave
Si sabes Latex, Sweave no es tan difícil. Aquí está su archivo de ejemplo como un archivo de Sweave:
/documentclass[12pt,BCOR3mm,DIV16]{scrreprt}
/usepackage{Sweave}
/begin{document}
An introduction
<<eval=TRUE,echo=TRUE>>=
x <- rnorm(100)
y <- jitter(x)
print(summary(x))
print(head(data.frame(x,y)))
cor(x,y)
@
Now a plot
/setkeys{Gin}{width=0.5/textwidth}
/begin{figure}[h]
/centering
<<echo=FALSE, eval=TRUE, fig=TRUE, width=6, height=4>>=
plot(x,y)
@
/caption{/textit{A nice plot.}}
/end{figure}
/end{document}
En Linux, simplemente guarde el archivo como tmp.Rnw. Entonces
R CMD Sweave tmp.Rnw
pdflatex tmp.tex
buena sugerencia de @znmeb para probar Lyx, un extremo más parecido a una palabra para LaTeX, y como señala la documentación, hay un buen artículo sobre su uso con Sweave en la página 2 de esta edición de R news
Así es como lo hice en Ubuntu 10.04 siguiendo las pautas en el http://cran.fhcrc.org/contrib/extra/lyx/ :
sudo apt-get install lyx cd ~./lyx wget http://cran.fhcrc.org/contrib/extra/lyx/preferences cd layouts wget http://cran.fhcrc.org/contrib/extra/lyx/literate* wget http://cran.fhcrc.org/contrib/extra/lyx/literate-article.layout wget http://cran.fhcrc.org/contrib/extra/lyx/literate-book.layout wget http://cran.fhcrc.org/contrib/extra/lyx/literate-report.layout wget http://cran.fhcrc.org/contrib/extra/lyx/literate-scrap.inc cd ~/texmf/tex wget http://www.biostat.jhsph.edu/~rpeng/ENAR2009/Sweave.sty
- iniciar Lyx
- Preferencias -> Reconfigurar
- reiniciar Lyx
- Archivo -> nuevo
- Documento -> Configuración -> Clase de documento -> artículo (Sweave noweb)
Enlaces útiles: