如何在交互式会话中读取knitr/Rmd缓存?

msc*_*lli 14 r knitr r-markdown

我有一个Rmd包含大量缓存代码块的文件.

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

使用普通R脚本,我可以直接使用它来使我的交互式会话与脚本的最后一行相同.但是,这将导致(重新)执行交互式会话中的所有代码.

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

我怎样才能做到这一点?

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

Pet*_*ter 11

我创建的函数将对象从缓存的块加载到交互式R会话中.该功能是lazyload_cache_dirlazyload_cache_labels和可qwraps2版> 0.2.4

这里使用这些函数的详细示例 如下:

快速概述:

说你有文件 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)
```
Run Code Online (Sandbox Code Playgroud)

编织后,你最终得到一个这个项目目录

.
??? 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
Run Code Online (Sandbox Code Playgroud)

并且您想要从中加载对象first-chunk.

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

有关仅加载缓存对象的整个目录或从缓存块中加载特定对象的详细信息,请参阅博客文章.


Ben*_*ker 6

认为library("knitr"); knit("foo.Rmd")在控制台/ R会话中运行是最简单的方法,虽然它会重写foo.md,数字等等.(太忙/懒于测试它.)

您可能可以在cache目录中查找并直接读取缓存的文件,但这将是更多的工作/更棘手.

  • 实际上,我只是花了相当多的精力制作了一个 MWE 来展示为什么该解决方案不起作用,只是惊讶地发现它确实有效。`knitr` 会智能地在到达第一个修改此参数的缓存块时立即用缓存值覆盖参数。因此运行 `Rscript -e 'library("knitr");knit("foo.Rmd",out="/dev/null");bar'` 实际上会打印 `"X"`。 (2认同)

sie*_*ste 6

在内部,knitr用于lazyLoad加载缓存的结果,因此您可以:

lazyLoad('knitr_cache_dir/chunk_2c7d6b477306be1d4d4ed451f2f1b52a')
Run Code Online (Sandbox Code Playgroud)

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