Как загрузить файл (выбранный с блестящим виджетом) только один раз, но использовать несколько раз в документе R-Markdown с Shiny Runtime - PullRequest
0 голосов
/ 05 марта 2019

Используя виджет 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))
 })

1 Ответ

1 голос
/ 05 марта 2019

Если вы загрузите файл во фрейм данных в виде отдельного реактивного выражения, а затем будете ссылаться на это выражение во всех соответствующих интерфейсах пользователя, я считаю, что это выполнит то, что вам нужно.Вот небольшой пример:

---
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).

...