2012-03-02 9 views
13

Estoy tratando de archivar un informe y mi problema es que cada vez que compilo R carga los paquetes que uso en el informe (como ggplot2, MASS, cubature ..). Esto consume mucho tiempo. ¿Hay alguna manera de organizar los paquetes?Sweave Cache packages

Encontré cacheSweave pero no funciona.

Este es el trozo he añadido en el archivo Sweave:

<<cacheSweave, eval=TRUE, echo=FALSE, term=FALSE, cache=TRUE>>= 
library(cacheSweave) 
lapply(c("ghyp","MASS","nloptr","cubature","ggplot2"), require, character.only=T) 
@ 

Gracias

+1

cargar paquetes es lo que 'cachSweave' llamó" efectos secundarios ", que no se pueden almacenar en caché; si usa 'knitr', puedo indicarle una dirección para ir a –

+0

No sabía * knitr *, parece interesante. Tal vez lo intente este fin de semana! ¿Cómo lo harías con knitr? Gracias – rainer

Respuesta

18

Desde que mostró interés en el paquete knitr, pasé algún tiempo la implementación de esta función, y se puede descargar el desarrollo versión desde https://github.com/yihui/knitr. Como dije, cacheSweave no conserva ningún efecto secundario; la versión estable actual de knitr en CRAN solo conserva los efectos secundarios de la impresión, y los efectos secundarios de cargar paquetes se conservan en la versión de desarrollo (> = 0.3.3) en GitHub. Cuando ejecuta un fragmento almacenado en caché, todos los nombres de paquete se guardan en caché en un archivo __packages. La próxima vez que se reconstruya este fragmento, todos los paquetes se cargarán antes de ejecutar el código en el fragmento, de lo contrario, este fragmento se saltará. En otras palabras, los paquetes solo se cargan cuando realmente se necesitan.

La otra forma de hacerlo es utilizar los ganchos de los fragmentos, que no requieren la instalación de la versión de desarrollo. Por ejemplo, puede agregar una opción trozo llamado packages, y el diseño de un gancho trozo como:

<<setup, include=FALSE, cache=FALSE>>= 
knit_hooks$set(packages = function(before, options, envir) { 
    if (before) { 
    ## load packages before a chunk is executed 
    for (p in options$packages) library(p, character.only = TRUE) 
    } 
}) 
@ 

continuación, puede utilizar esta opción trozo como

<<test, packages=c('MASS', 'ggplot2')>>= 
qplot(rnorm(100)) 
@ 

donde la opción packages es un vector carácter de nombres de paquete, que son utilizados por el gancho de fragmento definido anteriormente. La desventaja de este enfoque es que quizás deba especificar este vector packages para muchos fragmentos, mientras que el primer enfoque es automático. Es posible que necesite dedicar unos minutos a aprender cómo funcionan los ganchos en knitr: http://yihui.name/knitr/hooks

1

No llamas library(cacheSweave) en su archivo Sweave (RNW). Considere la test.rnw siguiente archivo:

\documentclass{article} 
<<cachedCode,cache=TRUE>>= 
#this Sweave block will be cached 
@ 
\begin{document} 
\end{document} 

allí tendría que ejecutar esta usando:

require(cacheSweave) 
Sweave('test.rnw', driver=cacheSweaveDriver) 
+1

su declaración es verdadera pero no responde la pregunta del OP (vea el comentario de @Yihui arriba) –