2012-03-02 19 views
13

Próbuję zgnieść raport, a moim problemem jest to, że za każdym razem, gdy kompiluję R, ładuję pakiety, których używam w raporcie (jak ggplot2, MASS, kubatura ...). Jest to bardzo czasochłonne. Czy istnieje sposób na chache pakietów?Pakiety bufora Sweave

Znalazłem cacheSweave, ale to nie działa.

To kawałek I dodaje w pliku sweave:

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

Dzięki

+1

ładowanie pakietów jest tym, co 'cachSweave' nazywa się" efektami ubocznymi ", które nie mogą być buforowane; jeśli używasz 'knitr', mogę wskazać ci kierunek, aby przejść –

+0

Nie wiedziałem * knitr *, wygląda interesująco. Może spróbuję tego w ten weekend! Jak zrobiłbyś to z dzianiną? Dzięki – rainer

Odpowiedz

18

Ponieważ wykazało zainteresowanie pakietem knitr, spędziłem trochę czasu realizacji tej funkcji, można pobrać rozwój wersja od https://github.com/yihui/knitr. Jak już powiedziałem, cacheSweave nie zachowuje żadnych skutków ubocznych; obecna stabilna wersja knitr na CRAN tylko zachowuje efekty uboczne drukowania, a efekty uboczne ładowania pakietów są zachowywane w wersji rozwojowej (> = 0.3.3) na GitHub. Po uruchomieniu pamięci podręcznej wszystkie nazwy pakietów są zapisywane w pamięci podręcznej w pliku __packages. Następnym razem, gdy ten fragment ma zostać przebudowany, wszystkie pakiety zostaną załadowane przed wykonaniem kodu w porcji, w przeciwnym razie ten porcja zostanie pominięty. Innymi słowy, pakiety są ładowane tylko wtedy, gdy są naprawdę potrzebne.

Innym sposobem na to jest użycie haków typu chunk, co nie wymaga instalowania wersji rozwojowej. Na przykład można dodać opcję kawałek o nazwie packages i zaprojektować haczyk kawałek takiego:

<<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) 
    } 
}) 
@ 

Następnie można użyć tej opcji klocek jak

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

gdzie opcja packages jest wektorem charakter nazwy paczek, które są używane przez zdefiniowany powyżej uchwyt chunk. Wadą tego podejścia może być konieczność określenia tego wektora packages dla wielu porcji, podczas gdy pierwsze podejście jest automatyczne. Być może trzeba będzie poświęcić kilka minut na poznanie, jak działa haczyki na poręczy: knitr: http://yihui.name/knitr/hooks

1

Nie mów library(cacheSweave) w pliku swojej Sweave (RNW). Rozważmy następujący test.rnw plik:

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

Wtedy uruchomieniu tego przy użyciu:

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

twoje oświadczenie jest prawdziwe, ale nie odpowiada na pytanie OP (patrz komentarz @ Yihui powyżej) –