我正在试图编写报告,我的问题是每次编译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)
@
谢谢
答案 0 :(得分:18)
由于您对knitr
软件包感兴趣,我花了一些时间来实现此功能,您可以从https://github.com/yihui/knitr下载开发版本。正如我所说,cacheSweave
不会保留任何副作用; CRAN上当前稳定版本的knitr
仅保留打印的副作用,加载包的副作用在GitHub上的开发版本(&gt; = 0.3.3)中保留。运行缓存的块时,所有包名称都缓存在文件__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
是包名称的字符向量,由上面定义的块挂钩使用。这种方法的缺点是您可能必须为许多块指定此packages
向量,而第一种方法是自动的。您可能需要花费几分钟时间来了解chunk hook在knitr
中的工作方式:http://yihui.name/knitr/hooks
答案 1 :(得分:1)
您不在Sweave(rnw)文件中调用library(cacheSweave)
。请考虑以下test.rnw
文件:
\documentclass{article}
<<cachedCode,cache=TRUE>>=
#this Sweave block will be cached
@
\begin{document}
\end{document}
然后你可以使用:
运行它require(cacheSweave)
Sweave('test.rnw', driver=cacheSweaveDriver)