【问题标题】:How to read knitr/Rmd cache in interactive session?如何在交互式会话中读取 knitr/Rmd 缓存?
【发布时间】:2015-09-20 22:49:25
【问题描述】:

我有一个 Rmd 文件,其中包含很多缓存的代码块。

现在我想继续使用交互式会话开发该脚本,以在将最终代码放入文档的新块之前尝试和测试不同的解决方案。

使用简单的R 脚本,我可以直接获取它,以使我的交互式会话与脚本的最后一行保持一致。 但是,这会导致(重新)执行交互式会话中的所有代码。

我想将我的 Rmd 文件读入交互式会话,忽略 Markdown 部分并利用现有的 knitr 缓存,理想情况下不创建任何输出。

我该怎么做?

PS:我不是在寻找一些特定于 IDE 的方法来设置它,而是在寻找可以从任何终端模拟器中的简单 R 会话运行的命令。

【问题讨论】:

    标签: r knitr r-markdown


    【解决方案1】:

    我已经创建了将缓存块中的对象加载到交互式 R 会话中的函数。函数为lazyload_cache_dirlazyload_cache_labels,在qwraps2 版本> 0.2.4

    中可用

    使用这些函数的详细示例是 here:

    快速概览:

    假设你有文件report.Rmd

    ---
    title:  "A Report"
    output: html_document
    ---
    
    ```{r first-chunk, cache = TRUE}
    fit <- lm(mpg ~ wt + hp, data = mtcars)
    x <- pi
    ```
    
    ```{r second-chunk, cache = TRUE}
    fit <- lm(mpg ~ wt + hp + am, data = mtcars)
    xx <- exp(1)
    ```
    

    编织后你会得到一个这个项目目录

    .
    ├── report_cache
    │   └── html
    │       ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.RData
    │       ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.rdb
    │       ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.rdx
    │       ├── __packages
    │       ├── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.RData
    │       ├── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.rdb
    │       └── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.rdx
    ├── report.html
    └── report.Rmd
    

    并且您想从first-chunk 加载对象。

    lazyload_cache_labels("first-chunk", path = "report_cache/html")
    ## Lazyloading report_cache/html/first-chunk_bf368425c25f0c3d95cac85aff007ad1
    ls()
    ## [1] "fit" "x"
    

    有关仅加载缓存对象的整个目录或从缓存块中加载特定对象的详细信息,请参阅the blog post

    【讨论】:

      【解决方案2】:

      在内部,knitr uses lazyLoad 加载缓存结果,你也可以:

      lazyLoad('knitr_cache_dir/chunk_2c7d6b477306be1d4d4ed451f2f1b52a')
      

      确保提供不带后缀的文件名。

      【讨论】:

        【解决方案3】:

        认为在控制台/R 会话中运行 library("knitr"); knit("foo.Rmd") 是最简单的方法,尽管它会重写 foo.md、数字等。(太忙/懒得现在测试一下。)

        您可能可以在cache 目录中四处寻找并直接读取缓存的文件,但这会做更多的工作/更棘手。

        【讨论】:

        • 我真的很想避免重写 Markdown 文件,因为我可能有一个 Makefile 取决于那个。我希望像您的第二个建议一样,但以一种自动的方式(我想一个必须解析 Rmd,识别代码块,散列它们,检查匹配的缓存,如果可能的话加载数据或运行代码跳过打印& 否则绘制语句。如果确实没有函数执行此操作或类似的操作,我会很好地编写它,因为我会一遍又一遍地使用它。最重要的是,缓存可以依赖于(也缓存的)参数在阅读它。
        • @mschilli 您能否向output 参数提供/dev/null(或您不关心的文件)?
        • @NickK:我可以,如果缓存最初是由Rscript -e 'library("knitr");knit("foo.Rmd")' 生成的,这将起作用。然而,它是由Rscript -e 'library("knitr");bar&lt;-"X";knit("foo.Rmd")' 生成的,X 在加载缓存时是未知的。这就是我想使用缓存的原因之一:它不仅可以通过不重新计算所有内容来节省时间,而且当kniting foo.Rmd 时,缓存也会包含分配给bar 的值。
        • 实际上,我只是花费了相当多的精力制作了一个 MWE 来说明为什么该解决方案不起作用,只是惊讶地发现它确实起作用。 knitr 很聪明,一旦到达修改此参数的第一个缓存块,就可以用缓存值覆盖参数。所以运行Rscript -e 'library("knitr");knit("foo.Rmd",out="/dev/null");bar'实际上会打印"X"
        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 2017-06-17
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多