Использовать имя загруженного файла в обработчике загрузки приложения flexdashboard - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу иметь возможность использовать имя файла, загруженного в мое блестящее приложение, в обработчике загрузки. Мой пример использования - создание отчета и объединение исходного имени файла (загруженного) с дополнительным текстом.

Я создал приложение MWE, в котором вы можете загрузить файл CSV и загрузить тот же файл. Загруженный файл должен иметь то же имя с добавлением «NEW».

---
title: Test downloading file with correct name
runtime: shiny
output: 
  flexdashboard::flex_dashboard
---

# Sidebar {.sidebar}

```{r}

#############
## Upload  ##
#############
fileInput("file", "Upload CSV File",
          accept = c(
              "text/csv",
              "text/comma-separated-values,text/plain",
              ".csv"))

######################################
## Download file with the same name ##
######################################
downloadHandler(
    filename = paste("NEW", input$file$name),
    content = function(file) {
        write.csv(x = read.csv(input$file$datapath),
                   file = file, row.names = FALSE)
    },
    outputArgs = list(label = "Download Uploaded File"))

```

Вместо этого загруженный файл называется NEW_, но его содержимое правильное.

Я обнаружил, что могу получить правильное имя файла (по крайней мере, иногда), добавив оператор наблюдения к имени файла:

---
title: Test downloading file with correct name
runtime: shiny
output: 
  flexdashboard::flex_dashboard
---

# Sidebar {.sidebar}

```{r}

#############
## Upload  ##
#############
fileInput("file", "Upload CSV File",
          accept = c(
              "text/csv",
              "text/comma-separated-values,text/plain",
              ".csv"))

######################################
## Download file with the same name ##
######################################
downloadHandler(
    filename = paste("NEW", input$file$name),
    content = function(file) {
        write.csv(x = read.csv(input$file$datapath),
                   file = file, row.names = FALSE)
    },
    outputArgs = list(label = "Download Uploaded File"))

```
```{r, echo = FALSE}

## This doesn't produce output but is necessary to ensure that output files are
## named correctly
observe({
    show(input$file$name)
})

```

В файле справки для shiny::downloadHandler() говорится, что реактивные выражения можно использовать в функции content, так почему же первый блок кода не работает?

1 Ответ

0 голосов
/ 10 сентября 2018

Я заработал, добавив наблюдателя событий. Я не уверен, что это работает с вашим делом, но это дало желаемый результат. Я также сделал большинство комментариев непосредственно в коде

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
# Sidebar {.sidebar}

```{r echo=FALSE}

shinyApp(

  ui = fluidPage(
    fileInput("file", "Upload CSV File",
              accept = c(
                "text/csv",
                "text/comma-separated-values,text/plain",
                ".csv")),
    downloadButton("downloadData", label = "DL")
  ),

  server = function(input, output, session) {
    # Wait for input$file to change so we know there is data available
    observeEvent(input$file, {
      # store all the input$file objects on the_f
      the_f <- as.list(input$file)
      # Create the new file name for downloading
      new_name <- sprintf("NEW_%s.csv", the_f[['name']])
      # Go ahead and read in
      new_dat <- read.csv(the_f[['datapath']])
      # DL handler
      output$downloadData <- downloadHandler(
        filename = function(){
          # Just use the name from outside the handler we already created
          new_name
        },
          # Handle content as follows
        content = function(file){
          write.csv(new_dat, file = file, row.names = FALSE)
        }
      )
    })
  }
)
```

enter image description here

...