Да, это возможно, и вы были почти там. Ниже приведен минимальный рабочий пример. Я предполагаю, что ваш .xlsx
файл находится в той же папке, что и ваш app.R
. Обратите внимание, что я создал приложение в одном файле R, а не в двух отдельных файлах.
Хитрость в получении файла для загрузки заключается в использовании функции для содержимого внутри downloadHandler()
. В частности, мы используем базовую функцию file.copy()
. Нажатие на кнопку теперь должно загрузить файл: distribution.xlsx
. Этот файл, очевидно, можно обменять с файлом zip.
Если вы хотите, чтобы разные пользователи имели доступ к разным файлам Excel, вы можете написать дополнительную функцию внутри своей серверной функции, которая передает аргумент файла в downloadHandler()
.
# Load packages ----
pkgs <- c("shiny")
invisible(lapply(pkgs, require, character.only = TRUE))
# Set up the UI ----
ui <- fluidPage(
# Define your download button
downloadButton(
outputId = "downloadData",
label = "Excel Download"
)
)
# Set up the server side ----
server <- function(input, output, session) {
# Define the download handler with function() for content.
output$downloadData <- downloadHandler(
filename = "distribution.xlsx",
content = function(file) {
file.copy("distribution.xlsx", file)
}
)
}
# Combine into an app ----
shinyApp(ui = ui, server = server)