使用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))
})
答案 0 :(得分: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中具有更好反应性的用户进行更正)。