首页 > 解决方案 > 从 shiny_prerenderd 到静态运行时的 rmarkdown 缓存管理

问题描述

描述

我想允许用户下载一个(相当)精确版本的shiny_prerendered站点的副本。即,每个用户都应该能够个性化其自己的(动态)报告版本,并将其保存在 HTML 中。

我的主要问题是data块的缓存管理(计算需要几分钟)。

我试图复制静态渲染文件夹中的所有内容(包括缓存),但{rmarkdown}每次都重新创建一个新的数据缓存。奇怪的是,即使对于报告的多个连续请求,它也会重新创建缓存。此外,这仅在静态渲染发生时发生,即重新运行整个站点正确使用缓存(显然:-))!

重现步骤

在 RStudio 中,创建一个项目(例如rendercache/rendercache.Rproj),其中包含一个名为的文件夹report/,其中包含以下test-cache.Rmd文件。

然后运行它,然后单击按钮下载报告。可以看到文件夹中的缓存report/test-cache_test/html和里面的缓存report/static/test-cache_test/html是不一样的。此外,如果您尝试第二次下载报告(在同一会话中!),第二个文件夹(static/那些)中的缓存会再次更改。最后一件事对我来说毫无意义,因为报告应该以完全相同的方式复制两次!

---
params:
  export: FALSE
runtime: shiny_prerendered
---

```{r setup, include=FALSE}
library(magrittr)
```

```{r data, include=FALSE, cache=TRUE}
my_bigdata <- mtcars
```

```{r download, eval=!params$export}
shiny::downloadLink("report", "Generate report")
```

```{r render, context="server", eval=!params$export}
output$report <- shiny::downloadHandler("test-cache.html",
  function(file) {
    static_dir <- "static"
    dir <- fs::dir_create(static_dir)
    
    list.files(all.files = TRUE, include.dirs = TRUE) %>%
      setdiff(c(".", "..", static_dir)) %>% 
      file.copy(dir, recursive = TRUE, copy.date = TRUE)

    report <- fs::path(dir, "test-cache.Rmd")
    rmarkdown::render(report, "html_document", file,
      params = list(export = TRUE),
      runtime = "static",
      envir = new.env(parent = globalenv())
    )
  }
)
```

参考

主要问题

.Rmd有没有办法在使用“静态”运行时重新渲染 Shiny 预渲染维护/重用其数据缓存的整个副本(可能已修改) ?

标签: rcachingshinyr-markdownknitr

解决方案


推荐阅读