Sweave缓存包

13

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

Thanks


1
加载软件包是cachSweave所谓的“副作用”,无法缓存;如果您使用knitr,我可以指引您前进的方向。 - Yihui Xie
我不知道 knitr,它看起来很有趣。也许我会在这个周末尝试一下!你会如何使用 knitr?谢谢。 - rainer
2个回答

18

鉴于您对knitr软件包表现出了兴趣,我花费了一些时间来实现此功能,您可以从https://github.com/yihui/knitr下载开发版本。如我所说,cacheSweave不会保留任何副作用;在CRAN上的当前稳定版本的knitr仅保留打印的副作用,而加载软件包的副作用则保留在GitHub上的开发版本(> =0.3.3)中。当您运行缓存块时,所有软件包名称都将被缓存在一个名为__packages的文件中。下次要重建该块时,在执行该块中的代码之前将加载所有软件包,否则将跳过该块。换句话说,只有在真正需要它们时才会加载软件包。

另一种方法是使用chunk hooks,这不需要您安装开发版本。例如,您可以添加一个名为packages的块选项,并设计一个类似以下内容的chunk hook:

<<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


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)

1
你的陈述是正确的,但并没有回答 OP 的问题(请参见上面 @Yihui 的评论)。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接