gpt4 book ai didi

r - 从多个 Rmd 文件缓存 knit 外部代码

转载 作者:行者123 更新时间:2023-12-02 03:07:59 27 4
gpt4 key购买 nike

我很难让 knitr 在外部 R 文件中共享公共(public)源代码的两个 Rmd 文档之间利用缓存。虽然我可以在文件系统中看到两个文档都将输出写入同一组缓存文件,但每次将一个 Rmd 文档编织为 HTML 时,它都会覆盖前一个 Rmd 编​​织时创建的缓存文件。同一 Rmd 文件的多个编织成功地利用了缓存,而无需重新执行共享代码。我在配置缓存选项以支持多个文档时是否遗漏了一些内容?

示例代码和 sessionInfo() 转储如下。预先感谢您提供的任何帮助。

test1.R

## @knitr source_chunk_1
x <- Sys.time()
x

test1a.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

test1b.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

session 信息

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] knitr_1.5
loaded via a namespace (and not attached):
[1] evaluate_0.5.3 formatR_0.10 rmarkdown_0.2.05 stringr_0.6.2 tools_3.1.0

最佳答案

从 github 下载并修改 knit 源代码后,我相信我已经找到了问题的根源。 block.R 中的代码通过使用正在处理的代码块的内容和选项调用digest() 函数来设置缓存的哈希值:

hash = paste(valid_path(params$cache.path, label), digest::digest(content), sep = '_')

我临时插入了代码来写出上面每个示例 Rmd 脚本的内容对象中存储的数据。默认的 Fig.path 选项值是它们之间唯一不同的内容组成部分。

 > content$fig.path
[1] "./test1a_files/figure-html/"

> content$fig.path
[1] "./test1b_files/figure-html/"

在每个 Rmd 文件中设置全局 Fig.path 会导致内容对象和生成的哈希值相同。现在,当我编织两个 Rmd 文件时,两个文件都使用相同的缓存值。

Test1.R

## @knitr source_chunk_1
x <- Sys.time()
x

test1a.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-", fig.path = "knitrfig/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

test1b.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-", fig.path = "knitrfig/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

关于r - 从多个 Rmd 文件缓存 knit 外部代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com