由于你对这个knitr
包感兴趣,我花了一些时间实现这个功能,你可以从https://github.com/yihui/knitr下载开发版本。正如我所说,cacheSweave
不保留任何副作用;目前on CRAN的稳定版knitr
只保留了打印的副作用,加载包的副作用保留在GitHub上的开发版(>=0.3.3)。当你运行一个缓存的块时,所有的包名都缓存在一个文件中__packages
。下次要重建这个chunk时,在执行chunk中的代码之前会加载所有的包,否则会跳过这个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)
}
})
@
然后你可以使用这个块选项
<<test, packages=c('MASS', 'ggplot2')>>=
qplot(rnorm(100))
@
其中选项packages
是包名称的字符向量,由上面定义的块挂钩使用。这种方法的缺点是您可能必须packages
为许多块指定此向量,而第一种方法是自动的。您可能需要花几分钟时间了解块挂钩的工作原理knitr
:http: //yihui.name/knitr/hooks