代码之家  ›  专栏  ›  技术社区  ›  Benjamin Christoffersen

knitr cache:如果数据文件发生更改而不是其他选项(例如`图xyz`)

  •  2
  • Benjamin Christoffersen  · 技术社区  · 6 年前

    knitr ,我有一个块需要一段时间才能运行,我希望这个块在文件更改时更新,但在文件更改时不更新 fig.path cache chunk option to 1 但是我不能像建议的那样使用校验和 here

    下面是一个降价文件的示例

    ---
    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 或者做一些类似的事情 大型计算 但如果有一个 dpi fig.width fig.height cache = TRUE 不起作用。我想可以修改包,以便能够添加选项到 刀:::cache1.opts .

    1 回复  |  直到 6 年前
        1
  •  1
  •   CL.    6 年前

    如果我理解正确的话,问题是 cache.extra 如果 cache 1 . 事实上, this is by design

    所需的行为是使所有块(包括具有 cache = 1 缓存.额外

    如问题中所述,实现这一点的一种方法是使用 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)
    ```