Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在交互式会话中读取knitr/Rmd缓存?_R_Knitr_R Markdown - Fatal编程技术网

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

如何在交互式会话中读取knitr/Rmd缓存?,r,knitr,r-markdown,R,Knitr,R Markdown,我有一个Rmd文件,其中包含大量缓存的代码块 现在,我想继续使用交互式会话开发该脚本,在将最终代码放入文档的新块之前,对不同的解决方案进行测试 使用一个普通的代码> r>代码>脚本,我可以通过它来获得与脚本最后一行一致的交互式会话。 但是,这将导致(重新)执行交互式会话中的所有代码 我想将我的Rmd文件读入一个交互式会话,忽略标记部分&利用现有knitr缓存,理想情况下不创建任何输出 我该怎么做 PS:我不是在寻找某种特定于IDE的方法来设置它,而是寻找一个可以在任何终端仿真器中从简单的R会话运

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

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

使用一个普通的代码> r>代码>脚本,我可以通过它来获得与脚本最后一行一致的交互式会话。 但是,这将导致(重新)执行交互式会话中的所有代码

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

我该怎么做

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

我认为运行
库(“knitr”);控制台/R会话中的knit(“foo.Rmd”)
是最简单的方法,尽管它将重写
foo.md
、图形等。。(目前太忙/懒得测试。)


您可能可以在
缓存
目录中浏览并直接读取缓存文件,但这将需要更多的工作/技巧。

我创建了一些函数,将缓存块中的对象加载到交互式R会话中。这些功能是
lazyload\u cache\u dir
lazyload\u cache\u标签
,在版本>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)
```
您希望从
第一个块
加载对象

lazyload_cache_labels("first-chunk", path = "report_cache/html")
## Lazyloading report_cache/html/first-chunk_bf368425c25f0c3d95cac85aff007ad1
ls()
## [1] "fit" "x"
有关仅加载整个目录的缓存对象或从缓存块中加载特定对象的详细信息,请参阅。

要在内部加载缓存结果,请执行以下操作:

lazyLoad('knitr_cache_dir/chunk_2c7d6b477306be1d4d4ed451f2f1b52a')

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

我确实希望避免重新写入标记文件,因为我可能有一个Makefile,这取决于该文件。我希望得到你的第二个建议,但以自动的方式(我想必须解析Rmd,识别代码块,散列它们,检查匹配的缓存,如果可能的话加载数据,或者运行跳过打印和打印语句的代码。如果真的没有函数执行此操作或类似操作,我可以编写它,因为我会反复使用它。最重要的是,缓存可以依赖于(也缓存)读取时未知的参数。@mschilli您能为
输出
参数提供/dev/null(或一个您不关心的文件)吗?@NickK:我可以,如果缓存是由
Rscript-e'库(“knitr”);knit(“foo.Rmd”)生成的,这将起作用“
首先,它是由
Rscript-e”库(“knitr”)生成的;实际上,我只是花了相当多的精力制作了一个MWE来说明为什么该解决方案不起作用,只是惊讶地发现它确实起作用。
knitr
是智能的,在到达修改该参数的第一个缓存块时,就用缓存值覆盖参数。因此运行
Rscript-e'库(“knitr”);knit(“foo.Rmd”,out=“/dev/null”);条“
将实际打印
“X”
lazyLoad('knitr_cache_dir/chunk_2c7d6b477306be1d4d4ed451f2f1b52a')