web-dev-qa-db-fra.com

Shiny R - téléchargez le résultat d'un tableau

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é

5
jmarco10

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:

  • l'argument 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(), ...
  • l'argument 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.
  • vous reliez les 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.

9
Joris Meys

Une solution légèrement alternative basée directement sur l'extension datatable/DTbuttons.

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.

5
user3293236

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.

0
Fabian Pino