Ответ 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