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