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

问题描述 投票:0回答:1

使用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))
 })
r shiny rstudio r-markdown
1个回答
1
投票

如果您将文件作为单独的反应式表达式加载到数据框中,然后在所有相关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中的反应性)。

© www.soinside.com 2019 - 2024. All rights reserved.