繁体   English   中英

如何仅使用一次加载文件(使用闪亮的小部件选择),但是在带有Shiny运行时的R-Markdown文档中使用多次

[英]How to load a file (selected with shiny widget) only once but use multiple times in R-Markdown document with Shiny runtime

使用fileInput小部件,将路径设置为R-markdown文档中的文件。 该路径导致一个大文件。 该文件的内容在文档的多个部分中都是必需的。 到目前为止,我将文件加载到需要它的每个部分。 由于文件加载需要一些时间,因此更改文件会导致相当长的加载时间。 我希望在路径更改后仅加载一次文件。

下面的最小示例显示了我当前的实现方式,在该文件的每个使用部分加载文件。

--- output: html_document runtime: shiny ---

library(kableExtra)
knitr::opts_chunk$set(echo = TRUE)
 fileInput("file", label = h3("File input"))
 renderUI({
   loaded_file <-read.csv(input$file$datapath, sep = ";", header = T)
   paste(loaded_file[1,2])
 })
 renderUI({
   loaded_file <-read.csv(input$file$datapath, sep = ";", header = T )
   HTML(kable(loaded_file))
 })

如果您将文件作为单独的反应式表达式加载到数据框中,然后在所有相关的UI中引用该表达式,我相信这将满足您的需求。 这是一个小例子:

---
output: html_document
runtime: shiny
---

```{r load_file}
library(kableExtra)
library(dplyr)
knitr::opts_chunk$set(echo = TRUE)

fileInput("file", label = h3("File input"))
loaded_file_test = reactive({
  if(is.element("datapath", names(input$file))) {
    print("loading file now...")
    read.csv(input$file$datapath, sep = ",", header = T)
  }
})
```

```{r first_ui}
renderUI({
  HTML(kable(loaded_file_test() %>% head(10)))
})
```

```{r second_ui}
renderUI({
  HTML(kable(loaded_file_test() %>% head(10)) %>% kable_styling())
})
```

运行文档时,“正在加载文件...”仅打印一次。 我将其解释为意味着该文件仅被加载一次(尽管我很高兴能对Shiny中的反应性有更好的了解的用户进行更正)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM