【问题标题】:Sweave Cache packagesSweave 缓存包
【发布时间】:2012-03-21 06:08:00
【问题描述】:

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

谢谢

【问题讨论】:

  • 加载包是cachSweave所说的“副作用”,无法缓存;如果你用knitr,我可以给你指个方向
  • 我不知道 knitr,看起来很有趣。也许这个周末我会试试看!你会怎么用knitr做呢?谢谢

标签: r sweave knitr


【解决方案1】:

由于您对knitr 包表现出兴趣,我花了一些时间实现此功能,您可以从https://github.com/yihui/knitr 下载开发版本。正如我所说,cacheSweave 不会保留任何副作用; 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

【讨论】:

    【解决方案2】:

    您不会在 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)
    

    【讨论】:

    • 您的陈述是真实的,但没有回答 OP 的问题(见上面@Yihui 的评论)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多