Shiny Download - Echec, problème avec le serveur

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Shiny Download - Echec, problème avec le serveur

Messagepar Alexis Rosa » 23 Nov 2020, 02:24

Bonjour,

Je développe actuellement une application shiny permettant de trier des datas selon les modalités de l'utilisateur puis d'afficher un plot (histogramme) en conséquence.

Je voudrais proposer à l'utilisateur de télécharger les données qu'il vient de trier ainsi que le plot qui va avec.

Deux remarques :
- Avec le navigateur R, la fenêtre de téléchargement s'ouvre, mais le nom du fichier n'est pas celui que j'ai indiqué sur le code (cf code, le nom affiché est dl_plot)
- Ayant lu qu'il fallait être sur un navigateur extérieur j'ai réitérer le téléchargement sur Chrome. Même problème concernant le nom, et l'erreur suivante s'affiche : "Echec - Problème avec le serveur".
Ces erreurs concernent mes deux téléchargements, aucun ne marche..

PS : J'essaye de laisser le choix à l'utilisateur de télécharger le plot en format png ou pdf.

Ci joint mon code simplifié, en omettant certaines parties :

Code : Tout sélectionner

ui = fluidPage(
fluidRow(
      column(12,
            plotOutput("plot"))
fluidRow(
      column(2, radioButtons("Format", label = "Selectioner le format du fichier", choices = list("png", "pdf"))),
      column(4, downloadButton("dl_plot", "Télécharger l'histogramme")),
fluidRow(
      column(12,
      dataTableOutput("PCR"))
 
 server = function(input, output) {
 
 }output$dl_data = downloadHandler(
       filename = function(){
          return("PCR.xlsx")
       },
       content = function(file){
          write_xlsx(dta[input$PCR_rows_all,], path = file)
       }
    )
   
 output$dl_plot = downloadHandler(
       filename = function(){
          paste("PCR", input$Format, sep=".")
       },
       content = function(file){
          if(input$Format =="png"){
             png(file)
          }else{
             pdf(file)
          }
          ggplot(dta[input$PCR_rows_all, ], aes(x = Sample, y = Ratio, fill = Target)) + geom_bar(stat = "identity", position = "dodge")
       }
    )


Merci d'avance,
AR

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Shiny Download - Echec, problème avec le serveur

Messagepar Mickael Canouil » 23 Nov 2020, 08:52

Bonjour,

si vous utilisez du ggplot2, vous devriez plutôt passer par ggsave() qui permet d'avoir plus de format et surtout de fermer le périphérique graphique, chose que vous ne faite pas dans votre code (dev.off() manquant).
De plus, la liste output est en dehors du "serveur", ce qui n'est pas normal.

Avez-vous consulter la gallerie des exemples d'application Shiny ? https://shiny.rstudio.com/gallery/
En particulier celui sur le téléchargement de fichier https://shiny.rstudio.com/gallery/file-download.html

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Re: Shiny Download - Echec, problème avec le serveur

Messagepar Alexis Rosa » 23 Nov 2020, 18:00

Bonjour,

Merci d'avoir attiré mon attention sur la fonction ggsave.
J'avais déjà essayé d'ajouter dev.off() dans mon code, ce qui ne changeait rien à mon problème. Voyant très peu de code de download l'utilisant, et ne comprenant pas réellement à quoi il pouvait me servir, je l'ai supprimé de mon code.

Oui j'avais consulté les exemples d'application R. J'essaye d'éviter d'utiliser la fonction reactive() (ce que je ne devrais peut être pas faire). Je préfère appeler directement les valeurs entrer dans le shiny avec input$.....

Pour les outputs en dehors de mon server, c'est une erreur que j'ai faites lors de ma simplification de code. Dans mon vraie code, tout est à l'intérieur du serveur.

Pouvez vous m'indiquez si j'utilise bien le dev.off dans le code ci dessous ?

Code : Tout sélectionner

output$dl_plot = downloadHandler(
       filename = function(){
          paste("PCR", input$Format, sep=".")
          dev.off()
       },
       content = function(file){
          ggsave(file, device = input$Format)
       }
    )


Avec ce code, j'ai les mêmes problèmes que précédemment : le filename est mauvais lorsque la fenêtre de téléchargement s'ouvre quelque soit le lieu du téléchargement, le téléchargement semble se faire mais le fichier n'est finalement pas enregistré à partir du navigateur R et le message Echec - Problème avec le serveur s'affiche à partir du navigateur chrome.

Bien à vous,
AR

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Shiny Download - Echec, problème avec le serveur

Messagepar jean lobry » 23 Nov 2020, 18:32

Bonjour Alexis,

Alexis Rosa a écrit :[...] Je voudrais proposer à l'utilisateur de télécharger les données qu'il vient de trier ainsi que le plot qui va avec. [...]


C'est une tâche ambitieuse car on ne peut pas télécharger simultanément le beurre (les données triées par l'utilisateur) et l'argent du beurre (le magnifique graphique scientifique de ta contribution).

Ma suggestion serait de procéder par étapes et de commencer par donner le code reproductible qui te pose problème pour la mise à disposition des utilisateurs des données triées. Sans code reproductible, personne ne pourra t'aider ici, même avec la meilleure volonté du monde.

Bien amicalement,

jean lobry

Alexis Rosa
Messages : 11
Enregistré le : 04 Nov 2020, 13:56

Re: Shiny Download - Echec, problème avec le serveur

Messagepar Alexis Rosa » 23 Nov 2020, 18:50

Bien sur,

Voici ci-dessous le code reproductible.

Code : Tout sélectionner

library(readxl)
library(shiny)
library(shinyWidgets)
library(shinythemes)
library(ggplot2)
library(DT)
library(writexl)

ui = fluidPage(theme = shinytheme("cerulean"),
               
   titlePanel("Analyse des données avec Shiny & Flexdashboard"),
     
   fluidRow(
     column(12,
            fileInput("file1", label = "Selectionnez le fichier bilan", accept =".xlsx", buttonLabel = "Parcourir", placeholder = "Pas de fichier sélectionné"),
            br(),
            hr(),
            )),
   fluidRow(
      column(12,
            plotOutput("plot"))
     ),
   fluidRow(
      column(2, radioButtons("Format", label = "Selectioner le format du fichier", choices = list("png", "pdf"))),
      column(4, downloadButton("dl_plot", "Télécharger l'histogramme")),
      ),
   br(),
   hr(),
   fluidRow(
      column(12,
             dataTableOutput("PCR"))
      ),
   fluidRow(
      column(2,
             downloadButton("dl_data", "Télécharger les datas"))
      ),
)

server = function(input, output) {

    output$PCR = renderDataTable({
     
      req(input$file1)
     
      dta = read_xlsx(input$file1$datapath, sheet = 1, col_names = TRUE)
     
      datatable(dta,
          options = list(autoWidth = TRUE),
          filter = list(position = "top", clear = TRUE))
     
    })
   
    output$dl_data = downloadHandler(
       filename = function(){
          return("PCR.xlsx")
       },
       content = function(file){
          write_xlsx(dta[input$PCR_rows_all,], path = file)
       }
    )
   
    output$plot = renderPlot({
       
      req(input$file1)
     
      dta = read_xlsx(input$file1$datapath, sheet = 1, col_names = TRUE)
       
      ggplot(dta[input$PCR_rows_all, ], aes(x = Sample, y = Ratio, fill = Target)) + geom_bar(stat = "identity", position = "dodge")
   })
   
    output$dl_plot = downloadHandler(
       filename = function(){
          paste("PCR", input$Format, sep=".")
          dev.off()
       },
       content = function(file){
          ggsave(file, device = input$Format)
       }
    )
}


Je reste à votre disposition s'il manque quoique ce soit.

PS: désolé pour la longueur du code, je ne savais pas comment simplifier sans perdre de l'information..

Cordialement,
AR

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Shiny Download - Echec, problème avec le serveur

Messagepar Mickael Canouil » 25 Nov 2020, 09:14

Un livre : https://mastering-shiny.org/

pour dev.off(), avez-vous consulté la documentation ?
De même pour ggsave ? Votre code ne sauvegarde rien, en effet uniquement les arguments filenames et device sont renseignés.

Consulter la documentation de fonction que l'on ne connait pas n'est pas optionnelle, en particulier pour en connaître les arguments et surtout savoir ce la fonction répond bien à la problématique.

Code : Tout sélectionner

output$dl_plot <- downloadHandler(
  filename = function() {
    paste("PCR", input$Format, sep = ".")
  },
  content = function(file) {
    ggsave(filename = file, plot = output$plot)
  }

Ou

Code : Tout sélectionner

output$dl_plot <- downloadHandler(
  filename = function() "PCR",
  content = function(file) {
    ggsave(filename = file, plot = output$plot, device = input$Format)
  }


Vous avez choisi d'utiliser l'extension DT, avez-vous regardé les options de datatable() ? https://rstudio.github.io/DT/extensions.html
Image

Pour quelle raison évitez-vous reactive() ? C'est la base fondamental de shiny ... (https://mastering-shiny.org/basic-reactivity.html https://mastering-shiny.org/why-reactivity.html)
Toutes les fonctions render*() ou downloadHandler() dans votre code sont des environnements "reactive".
Dans le cas présent, vous n'avez absolument aucun autre choix, de plus cela évitera de lire deux fois le même fichier excel et de faire deux fois la même sélection.

Code : Tout sélectionner

server <- function(input, output) {
  dta <- reactive({
    req(input$file1)
    read_xlsx(input$file1$datapath, sheet = 1, col_names = TRUE)
  })
  
  dta_selected 
<- reactive({
    req(input$PCR_rows_all, dta())
    dta()[input$PCR_rows_all, ]
  })
  
  output$PCR 
<- renderDataTable({
    req(dta())
    datatable(dta(),
      options = list(autoWidth = TRUE),
      filter = list(position = "top", clear = TRUE)
    )
  })

  output$dl_data <- downloadHandler(
    filename = function() "PCR.xlsx",
    content = function(file) write_xlsx(dta_selected(), path = file)
  )

  output$plot <- renderPlot({
    req(dta_selected())
    ggplot(dta_selected(), aes(= Sample, y = Ratio, fill = Target)) +
      geom_bar(stat = "identity", position = "dodge")
  })

  output$dl_plot <- downloadHandler(
    filename = function() paste("PCR", input$Format, sep = "."),
    content = function(file) ggsave(filename = file, plot = output$plot)
  )


Code non testé, puisque je n'ai pas les fichiers requis.
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité