Sweave Cache包

时间:2012-03-02 18:20:33

标签: r sweave knitr

我正在试图编写报告,我的问题是每次编译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)
@

谢谢

2 个答案:

答案 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)