Пакеты Sweave Cache - PullRequest
       11

Пакеты Sweave Cache

13 голосов
/ 02 марта 2012

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

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

Это кусок, который я добавил в файл Sweave:

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

Спасибо

Ответы [ 2 ]

18 голосов
/ 05 марта 2012

Поскольку вы проявили интерес к пакету 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 - это символьный вектор имен пакетов, которые используются хуком chunk, определенным выше.Недостатком этого подхода является то, что вам может потребоваться указать этот вектор packages для многих кусков, тогда как первый подход является автоматическим.Возможно, вам придется потратить несколько минут на изучение работы хуков чанков в knitr: http://yihui.name/knitr/hooks

1 голос
/ 03 марта 2012

Вы не звоните 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)
...