Подтвердить что ты не робот

Пакеты Sweave Cache

Я пытаюсь заманить отчет, и моя проблема заключается в том, что каждый раз, когда я компилирую 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)
@

Спасибо

4b9b3361

Ответ 1

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

Другой способ сделать это - использовать куски, которые не требуют установки версии для разработки. Например, вы можете добавить опцию chunk с именем 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)
  }
})
@

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

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

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

Ответ 2

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