Sweave: diferència entre les revisions
Línia 20: | Línia 20: | ||
Aquí empieza el texto | Aquí empieza el texto | ||
Si el primer ''chunk'' de texto está immediatamente después de los encabezados (es decir si no hay ningún ''chunk'' de código previamente), no es necesario especificar su inicio. En cambio, si el último ''chunk'' es de código de [[R]], hay que especificar el inicio de un ''chunk'' de texto antes de los cierres del | Si el primer ''chunk'' de texto está immediatamente después de los encabezados (es decir si no hay ningún ''chunk'' de código previamente), no es necesario especificar su inicio. En cambio, si el último ''chunk'' es de código de [[R]], hay que especificar el inicio de un ''chunk'' de texto antes de los cierres del documento de [[Latex|LaTeX]]. | ||
Los ''chunks'' del código que debe ser evaluado por [[R]] deben empezar por la cadena '''<<''argumentos''>>=''': | |||
<<''Argumento1=ValorDelArgumento1, Argumento2=ValorDelArgumento2, ...''>>= | <<''Argumento1=ValorDelArgumento1, Argumento2=ValorDelArgumento2, ...''>>= |
Revisió del 15:32, 6 juny 2005
Sweave se inscribe en lo que se ha venido a denominar Literate Statistics. El objetivo es tener en un único fichero de sintaxis el texto de LaTeX y el código de R entremezclados. Cuando se procesa el código, el output mezcla automáticamente el texto de LaTeX con las tablas y otros objetos de R, lo que facilita enormemente algunas tareas como la generación periódica de informes o de textos cuando se cambian, aunque sea mínimamente, los datos de origen.
Requerimientos
- Una distribución LaTeX instalada y funcionando (teTex en GNU/Linux o MiKTeX en M$).
- Tener instalado y funcionando el sistema R.
- Un editor de sintaxis, preferentemente Emacs aunque bajo M$ se puede usar también WinEdt.
- Si se trabaja en Emacs, es aconsejable tener instalado el módulo Noweb que permite el coloreado de la sintaxis de Sweave (chunks). Ningún otro editor permite esta función.
Sintaxis básica
Los archivos de sintaxis de Sweave deben guardarse con la extensión .Rnw.
La mayor parte del fichero tendrá la apariencia de un archivo de LaTeX (incluidos los encabezados), aunque con la particularidad de contener chunks, que pueden entenderse como partes diferenciadas de la sintaxis correspondientes a distintos tipos de código.
Los chunks de texto, que serán procesados por LaTeX, deben empezar por el signo @:
@ Aquí empieza el texto
Si el primer chunk de texto está immediatamente después de los encabezados (es decir si no hay ningún chunk de código previamente), no es necesario especificar su inicio. En cambio, si el último chunk es de código de R, hay que especificar el inicio de un chunk de texto antes de los cierres del documento de LaTeX.
Los chunks del código que debe ser evaluado por R deben empezar por la cadena <<argumentos>>=:
<<Argumento1=ValorDelArgumento1, Argumento2=ValorDelArgumento2, ...>>= Código de R
Los argumentos pueden ser, entre otros:
- un label para poder referirnos posteriormente a ese chunk. Si quiere especificarse, debe ser el primer argumento y ponerse sólo su valor sin ningún nombre de argumento:
<<resul2>>=
Para referirnos posteriormente a ese chunk, usaremos el código:
<<>>= <<resul2>>
El ejemplo 5 ilustra el uso de este argumento.
- echo=TRUE (por defecto) para mostrar el código de R (input) en el documento final, o echo=FALSE para ocultarlo
- results=hide para ocultar el resultado de R (output) en el documento final
- fig=TRUE para indicar que el código generará como resultado (output) un gráfico. En este caso se puede indicar el tamaño deseado para dicho gráfico con los argumentos width y height
- results=tex para indicar que el código generará como resultado (output) directo un código de R, habitualmente mediante el uso de funciones de librería xtable
- eval=FALSE para que el código no se evalúe en ese momento sino cuando se vuelva a llamar a ese chunk mediante su label
Estos argumentos pueden establecerse por defecto con el código:
\SweaveOpts{argumentos}
Dicho código tendrá validez hasta que se especifique lo contrario, ya sea en un chunk concreto o con otro establecimiento de opciones por defecto.
Por ejemplo, si queremos que por defecto no se muestre el código input:
\SweaveOpts{echo=false}
Aunque, como ya se ha dicho, la forma natural de insertar código de R es mediante el uso de chunks de código, si se trata de una única expresión el código puede ir dentro de un chunk de texto con la siguiente sintaxis:
@ Se incluyeron \Sexpr{length(seq(1,115))} sujetos.
Algunos ejemplos
- Ejemplo 1:
\documentclass[12pt]{report} \begin{document} Se incluyeron \Sexpr{length(x<-c(rep(c(1,2),225),rep(1,114)))} sujetos, con una proporcion de hombres del \Sexpr{100*round(prop.table(table(x))[1],2)} \%. \end{document}
- Ejemplo 2:
\documentclass[12pt]{report} \title{Document de prova} \author{acrida} \date{\today} \begin{document} \maketitle <<example data 1,echo=FALSE>>= x <- cbind(c(2,7),c(3,4)) @ Aquesta es la taula: <<example output for data 1,results=tex,echo=FALSE>>= library(xtable) xtable(x) @ \end{document}
- Ejemplo 3:
\documentclass[a4paper]{article} \SweaveOpts{echo=true} \begin{document} First we define a figure hook: <<results=hide>>= options(SweaveHooks = list(fig = function() par(mfrow=c(2,2)))) @ Then we setup variable definitions without actually evaluating them <<xydef,eval=false>>= x <- 1:10 y <- rnorm(x) @ Then we put the pieces together: \begin{center} <<fig=T>>= <<xydef>> lm1 <- lm(y~x) summary(lm1) plot(lm1) @ \end{center} \end{document}
- Ejemplo 4 (resultado aquí):
\documentclass[a4paper]{article} \begin{document} <<echo=false,results=hide>>= library(lattice) library(xtable) data(cats, package="MASS") @ \section*{The Cats Data} Consider the \texttt{cats} regression example from Venables \& Ripley (1997). The data frame contains measurements of heart and body weight of \Sexpr{nrow(cats)} cats (\Sexpr{sum(cats$Sex=="F")} female, \Sexpr{sum(cats$Sex=="M")} male). A linear regression model of heart weight by sex and gender can be fitted in R using the command <<>>= lm1 = lm(Hwt~Bwt*Sex, data=cats) lm1 @ Tests for significance of the coefficients are shown in Table~\ref{tab:coef}, a scatter plot including the regression lines is shown in Figure~\ref{fig:cats}. \SweaveOpts{echo=false} <<results=tex>>= xtable(lm1, caption="Linear regression model for cats data.", label="tab:coef") @ \begin{figure} \centering <<fig=TRUE,width=12,height=6>>= lset(col.whitebg()) print(xyplot(Hwt~Bwt|Sex, data=cats, type=c("p", "r"))) @ \caption{The cats data from package MASS.} \label{fig:cats} \end{figure} \begin{center} \end{center} \end{document}
- Ejemplo 5:
\documentclass[a4paper]{article} \begin{document} Primero ponemos el input: <<resultado,echo=TRUE,results=hide>>= 2+2 @ Y luego el output: <<resultado2,echo=FALSE>>= <<resultado>> @ \end{center} \end{document}
Procesamiento
El procesamiento (compilado) de un archivo de Sweave se compone básicamente de dos pasos:
- La función Sweave() de R, que evaluará los chunks con código de R y convertirá el archivo .Rnw a un archivo .tex convencional. Para realizar este paso hay que mandar la siguiente instrucción a R (desde el propio programa o desde Emacs o [1]]:
Sweave("c:/rutacompleta/nombredelarchivo.Rnw"
- Comipilar el documento .tex resultante del paso anterior para obtener, como es habitual en LaTeX, archivos .dvi, .ps o .pdf.
En sistemas M$ hay que realizar los dos pasos de forma independiente, ya sea con Emacs o con WinEdt.
En sistemas GNU/Linux, aunque también es posible realizar los pasos por separado, ambas tareas pueden automatizarse con el sistema que se explica a continuación.
Automatización del proceso con Emacs bajo GNU/Linux
Antes de poder procesar automáticamente documentos de Sweave hay que realizar el siguiente procedimiento, que deberá llevarse a cabo sólo una vez en cada ordenador y que permitirá ejecutar la función Sweave() de R sin necesidad de ejecutar manualmente el programa:
- Descargar este shell script, copiarlo a la ubicación /usr/local/bin/ y desde una ventana de terminal ejecutar:
sudo chmod +x /usr/local/bin/Sweave.sh
Una vez hecho esto, ya estamos en disposición de compilar documentos Sweave. Para ello, debemos descargar este archivo Makefile y ediarlo para sustituir la expresión:
nombrearchivo
presente en las dos primeras líneas, por el nombre de nuestro fichero Sweave sin la extensión .Rnw.
El fichero Makefile debe situarse en el mismo directorio donde tengamos el archivo .Rnw.
Así, para cada proyecto Sweave que tengamos, deberemos tener un directorio independiente con dos archivos: fichero.Rnw y un Makefile que en las dos primeras líneas contenga el nombre del archivo .Rnw (sin la extensión).
Una vez hecho esto, debemos editar el archivo .Rnw en Emacs, grabarlo y pulsar:
M-x compile {Ret} make -k {Ret}
Este procedimiento va a generar dos archivos con el documento final, un .pdf y otro .ps. El fichero Makefile descargado es fácilmente costumizable para que cree sólamente uno de los dos ficheros resultado.
Se acpnseja visualizar ambos tipos de archivos con el programa Gnome Ghost Viewer (es el visualizador por defecto de ficheros .ps), que actualiza directamente la vista de los archivos cuando estos cambian (es decir cada vez que se produce una nueva compilación) sin necesidad de tener que cerrar y volver a abrir el programa. Para que esto suceda, hay que marcar la opción Mira un fitxer en las preferencias del programa.
Todo lo anterior tiene la ventaja de permitir compilar archivos Sweave con una sola orden, lo que facilita la realización de compilaciones sucesivas para ir comprobando cómo está quedando nuestro documento, y detectar de forma temprana los errores en el código de R.
La compilación realizada con el procedimiento descrito tiene además otras ventajas, como por ejemplo que compila tantas veces como sea necesario el archivo .tex hasta que esté completo, lo que evita tener que recompilar manualmente los archivos que contienen, por ejemplo, referencias bibliográficas tal y como se explica en el artículo correspondiente.