13

我正在尝试编写一份报告,我的问题是每次编译 R 时都会加载我在报告中使用的包(如 ggplot2、MASS、cuature..)。这是非常耗时的。有没有办法查包?

我找到了 cacheSweave但它不起作用。

这是我在 sweave 文件中添加的块:

<<cacheSweave, eval=TRUE, echo=FALSE, term=FALSE, cache=TRUE>>=
library(cacheSweave) 
 lapply(c("ghyp","MASS","nloptr","cubature","ggplot2"), require, character.only=T)
@

谢谢

4

2 回答 2

18

由于你对这个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

于 2012-03-05T05:16:49.990 回答
1

您不会调用library(cacheSweave)您的 Sweave (rnw) 文件。考虑以下test.rnw文件:

\documentclass{article}
<<cachedCode,cache=TRUE>>=
#this Sweave block will be cached
@
\begin{document}
\end{document}

然后你可以使用:

require(cacheSweave)
Sweave('test.rnw', driver=cacheSweaveDriver)
于 2012-03-03T00:04:10.250 回答