2012-03-02 2 views
13

Я пытаюсь разгладить отчет, и моя проблема в том, что каждый раз, когда я компилирую R, загружает пакеты, которые я использую в отчете (например, ggplot2, MASS, кубатура ..). Это очень трудоемко. Есть ли способ скопировать пакеты?Sweave Cache packages

Я нашел cacheSweave, но он не работает.

Это кусок я добавил в sweave файле:

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

Благодаря

+1

Загрузка пакетов - это то, что 'cachSweave' называют« побочными эффектами », которые нельзя кэшировать; если вы используете 'knitr', я могу указать вам направление –

+0

Я не знал * knitr *, он выглядит интересным. Может быть, я попробую это в эти выходные! Как бы вы это сделали с knitr? Спасибо – rainer

ответ

18

Поскольку вы проявили интерес к knitr пакет, я провел некоторое время, осуществляя эту функцию, и вы можете загрузить развитие версия от https://github.com/yihui/knitr. Как я уже сказал, cacheSweave не сохраняет побочных эффектов; текущая стабильная версия knitr на CRAN сохраняет только побочные эффекты печати, а побочные эффекты пакетов загрузки сохраняются в версии разработки (> = 0.3.3) на GitHub. Когда вы запускаете кешированный кусок, все имена пакетов кэшируются в файле __packages. В следующий раз, когда этот фрагмент будет перестроен, все пакеты будут загружены перед выполнением кода в куске, иначе этот фрагмент будет пропущен. Другими словами, пакеты загружаются только тогда, когда они действительно нужны.

Другой способ сделать это - использовать куски, которые не требуют установки версии для разработки. Например, вы можете добавить опцию чанка по имени packages, и дизайн куска крючок, как:

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

Затем вы можете использовать эту опцию чанка как

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

где опция packages является характер вектор имена пакетов, которые используются описанным выше крючком куска. Недостатком этого подхода является то, что вам может потребоваться указать этот вектор packages для многих кусков, тогда как первый подход является автоматическим. Вам может потребоваться потратить несколько минут на изучение того, как работают куски в knitr: http://yihui.name/knitr/hooks

1

Вы не называйте library(cacheSweave) в файле Sweave (RNW). Рассмотрим следующий test.rnw файл:

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

Тогда вы бы запустить это с помощью:

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

Ваше утверждение верно, но не отвечает на вопрос OP (см. Комментарий @ Yihui выше) –