Поскольку вы проявили интерес к пакету 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