gpt4 book ai didi

r - knitr 缓存 : update if data file changes but not other options (e. g., `fig.xyz` )

转载 作者:行者123 更新时间:2023-12-04 13:44:08 26 4
gpt4 key购买 nike

假设我使用 knitr ,我有一个需要一段时间才能运行的块,我希望这个块在文件更改时更新,但如果我例如更改 fig.path .后来建议我换cache chunk option to 1但后来我不能按照建议使用校验和 here .

这是 Markdown 文件的示例

---
title: "Example"
author: "Benjamin Christoffersen"
date: "September 2, 2018"
output: html_document
---

```{r setup, include=FALSE}
data_file <- "~/data.RDS"
knitr::opts_chunk$set(echo = TRUE, cache.extra = tools::md5sum(data_file))
```

```{r load_data}
dat <- readRDS(data_file)
```

```{r large_computation, cache = 1}
Sys.sleep(10)
Sys.time() # just to that result do not change
```

```{r make_some_plot}
hist(dat)
```

运行 set.seed(1): saveRDS(rnorm(100), "~/data.RDS")和针织产量

enter image description here

然后运行 ​​ set.seed(2): saveRDS(rnorm(100), "~/data.RDS")和针织产量

enter image description here

显示 large_computation未按原样更新,因为 cache.extra不在 knitr:::cache1.opts向量。当然,我可以保存 md5sum结果,检查以前存储的文件并使用 cache.rebuild或在 large_computation 中做类似的事情块,但用 knitr 会很好解决方案。我经常发现我更改了一些块选项(例如, dpifig.widthfig.height )所以使用 cache = TRUE不管用。我想可以修改包以便能够向 knitr:::cache1.opts 添加选项.

最佳答案

如果我正确理解问题,问题是 cache.extra如果 cache 不考虑设置为 1 .事实上,this is by design .

如果外部文件(或更一般地说:提供给 cache = 1 的某些值)发生更改,则所需的行为是使所有块(包括带有 cache.extra 的块)的缓存无效。

如问题中所述,实现此目的的一种方法是使用 chunk option cache.rebuild 但不是手动跟踪外部文件中的更改,我会利用 knitr 的内置缓存功能:

```{r cachecontrol, cache = TRUE, cache.extra = tools::md5sum(data_file)}
knitr::opts_chunk$set(cache.rebuild = TRUE)
```

将此作为早期块添加,如果 data_file,所有后续块的缓存将失效。变化。这个想法是缓存控制后续块缓存的块——但前提是外部文件没有改变。

当然,这只适用于在 cachecontrol 之前没有更改全局块选项的情况。块被评估。

问题的完整示例:

运行 set.seed(1); saveRDS(rnorm(100), "data.RDS")用不同的种子生成不同的外部文件,然后编织:
---
title: "Invalidate all chunks condidional on external file (even if cache=1)"
output: html_document
---

```{r}
data_file <- "data.RDS"
```

```{r cachecontrol, include = FALSE, cache = TRUE, cache.extra = tools::md5sum(data_file)}
# do NOT change global chunk options before this chunk
knitr::opts_chunk$set(cache.rebuild = TRUE)
```

```{r setup, include = FALSE}
knitr::opts_chunk$set(echo = TRUE, fig.width = 8)
```


```{r load_data}
dat <- readRDS(data_file)
```

```{r large_computation, cache = 1}
Sys.sleep(10)
Sys.time() # just to show that result do not change unless external file changes
```

```{r make_some_plot}
hist(dat)
```

关于r - knitr 缓存 : update if data file changes but not other options (e. g., `fig.xyz` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52137535/

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