domingo, 8 de noviembre de 2009

De R a ODF: el paquete odfWeave

En el artículo LaTeX y R ya comenté las ventajas de combinar texto y fórmulas junto con instrucciones de R para obtener un informe dinámico que contendrá el texto, las fórmulas y los resultados numéricos y gráficos generados por R. Lamentablemente esto supone saber LaTeX (y R), y utilizar LaTeX no es sencillo. Sin embargo, la potencia de la función Sweave en R se ha extendido a otros formatos más amigables. Primero fué el paquete R2HTML para el formato html y ahora el paquete odfWeave para el formato ODF u OpenDocument.
El paquete odfWeave proporciona las funciones y el entorno para escribir informes automáticos en un formato libre y gratuito (como R), que se puede modificar a posteriori de forma muy sencilla y que permite su exportación a otros formatos como html o PDF.
La idea consiste en escribir un archivo ODF con un programa editor como OpenOffice con comentarios o explicaciones y código R para generar resultados y gráficos. La función odfWeave procesa ese archivo y nos entrega el documento ODF con el mismo texto y los resultados numéricos o gráficos insertados. Ese documento se puede modificar añadiendo otros elementos: vínculos, fotografías, encabezados y piés de página, etc. y finalmente imprimir o exportar.
Por ahora sólo funciona con documentos de texto, pero más adelante se puede ampliar a presentaciones y hojas de cálculo.

Veamos un ejemplo.

El documento de nombre ejemplo.odt contiene el siguiente texto:


Ejemplo

En este documento vamos a probar el paquete odfWeave.

Primero cargamos los datos de forma oculta para el documento final.

<<>>=

# Los datos son

coches <- mtcars[ ,1:6]

@

Los datos a estudiar contienen \Sexpr{dim(coches)[2]} variables medidas sobre \Sexpr{dim(coches)[1]} coches.

Podemos insertar una tabla resumen de los datos:

<<>>=

medias <- apply(coches,2,mean)

odfTable(medias, horizontal = TRUE)

@

También podemos añadir algún bonito gráfico:

<<>>=

pairs(coches)

@

Y así seguiría nuestro trabajo.





Si aplicamos el código:

library(odfWeave)
odfWeave(ejemplo.odt,resultado.odt)


obtenemos el documento resultado.odt


Ejemplo

En este documento vamos a probar el paquete odfWeave.

Primero cargamos los datos de forma oculta para el documento final.

Los datos a estudiar contienen 6 variables medidas sobre 32 coches.

Podemos insertar una tabla resumen de los datos:

mpg

cyl

disp

hp

drat

wt

20.091

6.188

230.722

146.688

3.597

3.217

También podemos añadir algún bonito gráfico:

Y así seguiría nuestro trabajo.




El formato de las imágenes y su tamaño se controlan con las funciones getImageDefs y setImageDefs.
Del mismo modo, el formato del texto o de las tablas se controla con las funciones de definición de estilo getStyleDefs y setStyleDefs, y las de asignación getStyle y setStyle para determinar algún elemento.

La clase odfTable se utiliza para convertir vectores, matrices y data frames a tablas ODF. La función odfCat sirve para escribir texto directamente en el formato ODF. También hay funciones para crear listas y para insertar imágenes externas.

Una vez tenemos el documento resultado, podemos utilizar OpenOffice para convertir manualmente este documento a otros formatos. Para ello se usa el menú Guardar como... o Exportar... del menú Archivo. En algunos sistemas operativos también disponemos de programas conversores desde la consola.

Para utilizar el paquete odfWeave es necesario que nuestro ordenador disponga de un compresor/descompresor de archivos ZIP. También deberemos tener en cuenta que los gráficos se graban en formato PNG, por si nuestro sistema no tiene el dispositivo adecuado.

2 comentarios:

  1. Buenas. Estoy probando el ejemplo y no me funciona en el ordenador del curro (windows xp), como compresor descompresor uso 7zip. El error que me da es:
    Copying prueba.odt
    Setting wd to C:\DOCUME~1\JOSELU~1\CONFIG~1\Temp\Rtmpa3W2Kz/odfWeave01184812890
    Unzipping ODF file using unzip -o "prueba.odt"
    Error en odfWeave("prueba.odt", "resultado.odt") : Error unzipping file
    Además: Mensajes de aviso perdidos
    In system(zipCmd[2], invisible = TRUE) : unzip no encontrado

    Gracias

    ResponderEliminar
  2. Tienes que instalar zip.exe y unzip.exe en una carpeta donde lo encuentre tu sistema operativo. O modificar el PATH de windows pero eso es más lioso...

    ResponderEliminar