Sweave

De wikiTraba
Salta a la navegació Salta a la cerca

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

En cambio, 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:

  • echo=TRUE o echo=FALSE para mostrar u ocultar el código de R (input) en el documento final
  • hide=FALSE o hide=TRUE para mostrar u ocultar el resultado de R (output) en el documento final
  • leo, completas tu esta parte de los argumentos? Digo lo de labels, figuras, etc.

Aunque en la mayoría de ocasiones el código de R debe situarse en chunks, si se trata de una única expresión 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: Ilustra la compilación del formato Sweave (.Rnw) bajo Emacs con Actualización dinamica del informe generado (.pdf)

R tiene un archivo de extensión .Rnw que puede generar un informe mas complejo, que incluye graficos y tablas, El siguiente codigo de R devolvera el path donde esta ubicado Sweave-test-1.Rnw

system.file("Sweave", "Sweave-test-1.Rnw", package = "utils")

Copia este archivo a una carpeta donde te sientas comodo trabajando, para no perturbar los ficheros de R.

Abre este archivo con Emacs; y si tienes configurado el Sweave en un solo paso (es decir con un "Makefile" personalizado para el proyecto ubicado en la misma carpeta del archivo .Rnw) solo hace falta desde Emacs compilar con "make"

M-x compile {ret}
{ret}

Se genera un archivo .pdf que puedes abrir con ggv como esta descrito en ... (recuerda marcar la casilla de observar un fichero/mirar un Arxiu/watch mode); esto es necesario para observar los cambios dinamicos en el informe; para ello, y desde el buffer de Emacs que contiene el .Rnw puedes editarlo, por ejemplo cambiando el titulo y el autor. y volviendo a compilar con "make" como se explica en el parrafo anterior. (tienes que responder "y" cuando te pregunte emacs si quieres salvar el buffer, ya que detectó cambios) automagicamente el archivo que esta abierto en ggv cambiara según se edite en vivo.

Procesamiento

El procesamiento 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.
  • Comipilar el documento .tex para obtener, como es habitual en LaTeX, archivos .dvi, .ps o .pdf.


Procesamiento convencional con Emacs bajo GNU/Linux

Antes de poder procesar 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. Este último formato presenta la ventaja de ser visualizable con Gnome Ghost Viewer, que actualiza directamente la vista de los archivos .ps 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 preferncias del programa.

Procesamiento alternativo con Emacs bajo GNU/Linux

El sistema descrito con anterioridad presenta la gran ventaja de ejecutar todo el proceso con una única 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.

Sin embargo, presenta también algún inconveniente, como por ejemplo el hecho que no se genera de forma visible un fichero .tex que en ocasiones sería necesario recompilar para obtener, por ejemplo, una bibliografía con el sistema BibTeX (leo, tu sabes pq ocurre esto?).

Leo: me he revisado el log del compilado y lo ultimo que hace es (rm elarchivo.tex elarchivo.dvi) es decir que se los carga, seguramente el makefile o tal vez el mismo emacs por considerarlos archivos intermedios. el programa de makefile nunca le dice que se carge nada, aunque texi2dvi parece que ya se ejecuta tantas veces como haga falta para crear los indices y lar referencias cruzadas:

The `texi2dvi' command automatically runs both TeX and `texindex' as
many times as necessary to produce a DVI file with sorted indices and
all cross-references resolved.  It is therefore simpler than manually
executing the `tex'--`texindex'--`tex'--`tex' sequence described in the
previous section.

Acrida: ok, ferpecto, esta tarde prueba a ver si hace bien lo de bibtex y arreglo el articulo para explicarlo bien.


Para poder obtener el archivo .tex hay que descomponer el proceso en sus dos pasos naturales:

Sweave("/rutacompleta/nombredelarchivo.Rnw")
  • Compilar con LaTeX el archivo .tex resultante de la operación anterior. Pueden realizarse tantas compilaciones como sean necesarias para obtener el resultado deseado. Las compilaciones se realizan por el procedimiento habitual de LaTeX explicado en el artículo correspondiente.

Procesamiento re-alternativo con Emacs bajo GNU/Linux

A completar mediante el link:

Otro enfoque, este toma los nombres del buffer

Procesamiento con Emacs o WinEdt bajo M$

En sistemas M$ no se pueden automatizar los dos pasos necesarios para la genración de documentos Sweave, por lo que deberán realizarse por separado:

  • Ejecutar en R (directamente en el programa o mandando la orden desde un editor):
Sweave("c:/rutacompleta/nombredelarchivo.Rnw")
  • Compilar con LaTeX el archivo .tex resultante de la operación anterior.

Enlaces de interés

Rnews: Sweave Parte I

Rnews: Sweave parte II

Otros enlaces y ejemplos interesantes