Je suis nouveau sur Shiny et j'ai créé une application brillante très simple:
library(shiny)
ui <- fluidPage(
fluidRow(column(7,dataTableOutput('dto')))
)
server <- function(input,output){
output$dto <- renderDataTable({MYTABLE})
}
runApp(list(ui=ui,server=server))
Est-il possible de mettre une option pour télécharger le résultat de la table (peu importe qu'il s'agisse de CSV, XLSX ...)
à votre santé
C'est assez facile avec downloadButton()
ou downloadLink()
en combinaison avec downloadHandler
si vous faites des données elles-mêmes une expression réactive. Ensuite, vous pouvez télécharger tout ce que vous envoyez à la sortie en utilisant la même expression réactive.
Un petit exemple:
library(shiny)
ui <- fluidPage(
# This one is linked by the id 'download'
downloadButton('download',"Download the data"),
fluidRow(column(7,dataTableOutput('dto')))
)
server <- function(input,output){
# Reactive expression with the data, in this case iris
thedata <- reactive(iris)
output$dto <- renderDataTable({thedata()})
output$download <- downloadHandler(
filename = function(){"thename.csv"},
content = function(fname){
write.csv(thedata(), fname)
}
)
}
runApp(list(ui=ui,server=server))
Garder en tete:
content
of downloadHandler
doit être une fonction produisant un fichier! Cela devrait prendre un argument pour le nom de connexion/fichier. Dans cet exemple, il s’agit d’un fichier csv, mais pour les images, par exemple, vous pouvez utiliser png()
et dev.off()
, pour les ggplots, vous pouvez utiliser ggsave()
, ...filename
ne doit pas nécessairement être une fonction, mais j'ai trouvé que cela fonctionnait mieux de cette façon. Surtout lorsque vous travaillez avec des expressions réactives pour le nom de fichier.downloadHandler
et les downloadButton
à la liste de sortie: l'id de downloadButton
est le nom de l'élément de sortie renvoyé par downloadHandler
.MODIFIER:
Certaines personnes essaient d'utiliser download.file()
pour cela, mais c'est également faux. La fonction download.file()
fonctionne lorsqu'elle est utilisée du côté utilisateur, pas du côté serveur. Il vous permet de télécharger des fichiers d’Internet sur l’ordinateur qui appelle la fonction. Si vous utilisiez cela dans une application Shiny, cela fonctionnerait s'il était exécuté localement. C'est parce que l'utilisateur et le serveur sont la même machine. Toutefois, lorsque vous déployez votre application sur un serveur Shiny, download.file()
consiste essentiellement à télécharger des fichiers SUR le serveur, et non à partir.
Une solution légèrement alternative basée directement sur l'extension datatable
/DT
buttons
.
J'emprunte sans vergogne les exemples de données de Joris ...
library(shiny)
library(DT)
ui <- fluidPage(
# This one is linked by the id 'download'
fluidRow(column(7,dataTableOutput('dto')))
)
server <- function(input,output){
# Reactive expression with the data, in this case iris
thedata <- reactive(iris)
#the extensions parameter coupled with the options list does the trick
output$dto <- renderDataTable(thedata(), extensions = 'Buttons',
options = list(dom = 'Bfrtip',
buttons = c('copy', 'csv', 'Excel', 'pdf', 'print'))
)
}
runApp(list(ui=ui,server=server), launch.browser=TRUE) #now runs by default in the external browser.
Cela fonctionnera avec différentes sorties et personnellement, j'aime le look plus propre. Assurez-vous simplement que vous exécutez la démo dans le navigateur externe. Sinon, ça ne marchera pas.
Je dois exécuter l'application dans le navigateur car le nom du fichier ne fonctionne pas. j'utilise
runApp(list(ui=ui,server=server),launch.browser = T)
et cela fonctionne parfaitement pour moi.
Si vous ne souhaitez pas utiliser launch.browser=TRUE
, vous pouvez écrire le nom de fichier et l'extension par exemple .csv à la fin du nom de fichier lorsque vous utilisez le bouton de téléchargement de l'application brillante.