R shiny: affiche le message “loading…” pendant que la fonction est en cours d’exécution

J’utilise le package Shiny GUI R. Je cherche un moyen d’afficher un message comme “loading …” après avoir appuyé sur actionButton. La fonction prend plusieurs minutes pour s’exécuter, donc je dois informer l’utilisateur d’une certaine manière que le bouton a déclenché un événement. Maintenant, le code server.R ressemble à ceci:

DATA 0) { RunDownload() } else { NULL } }) output$Download 0) { paste0(Sys.time(),": ",NROW(DATA()), " items downloaded") } else { '' } }) 

actionButton() est une fonction qui télécharge des données depuis Internet. input$DownloadButton est actionButton. Ainsi, après avoir appuyé sur le bouton, l’utilisateur attend plusieurs minutes et voit seulement un message indiquant que le téléchargement a réussi. Je voudrais afficher un message “Loading …” juste après que le bouton actionButton a été pressé, puis un autre message comme paste0(Sys.time(),": ",NROW(DATA()), " items downloaded") prend fin.

J’utilise déjà un moyen plus simple et plus fiable que celui que j’ai posté auparavant.

Une combinaison de

 tags$style(type="text/css", " #loadmessage { position: fixed; top: 0px; left: 0px; width: 100%; padding: 5px 0px 5px 0px; text-align: center; font-weight: bold; font-size: 100%; color: #000000; background-color: #CCFF66; z-index: 105; } ") 

avec

 conditionalPanel(condition="$('html').hasClass('shiny-busy')", tags$div("Loading...",id="loadmessage") ) 

Exemple:

 runApp(list( ui = pageWithSidebar( headerPanel("Test"), sidebarPanel( tags$head(tags$style(type="text/css", " #loadmessage { position: fixed; top: 0px; left: 0px; width: 100%; padding: 5px 0px 5px 0px; text-align: center; font-weight: bold; font-size: 100%; color: #000000; background-color: #CCFF66; z-index: 105; } ")), numericInput('n', 'Number of obs', 100), conditionalPanel(condition="$('html').hasClass('shiny-busy')", tags$div("Loading...",id="loadmessage")) ), mainPanel(plotOutput('plot')) ), server = function(input, output) { output$plot <- renderPlot({ Sys.sleep(2); hist(runif(input$n)) }) } )) 

tags $ head () n'est pas obligatoire, mais il est recommandé de conserver tous les styles dans la balise head.

J’ai résolu le problème en ajoutant le code suivant à sidebarPanel ():

 HTML(' ') 

Vous pouvez utiliser ShinyJS: https://github.com/daattali/shinyjs

Lorsque vous appuyez sur l’actionButton, vous pouvez facilement basculer un composant de texte affichant “loading …”, et lorsque le calcul est terminé, vous pouvez alors basculer ce composant sur caché.

J’ai trouvé une solution qui fonctionne bien pour moi. J’utilise le modal Bootstrap. Il est affiché lorsque l’exécution de la fonction démarre et est à nouveau masquée à la fin.

modalBusy <- function (id, title, ...) {

  msgHandler = singleton(tags$head(tags$script('Shiny.addCustomMessageHandler("jsCode", function(message) { console.log(message) eval(message.code); });' ) ) ) label_id = paste(id, "label", sep='-') modal_tag <- div(id=id, class="modal hide fade", "aria-hidden"=FALSE, "aria-labelledby"=label_id, "role"="dialog", "tabindex"="-1", "data-keyboard"=FALSE, "data-backdrop"="static") header_tag <- div(class="modal-header", h3(id=label_id, title)) body_tag <- div(class="modal-body", Row(...)) footer_tag <- div(class="modal-footer") modal_tag <- tagAppendChildren(modal_tag, header_tag, body_tag, footer_tag) tagList(msgHandler, modal_tag) } 

Pour le montrer et le cacher, utilisez les fonctions

 showModal <- function(id,session) { session$sendCustomMessage(type="jsCode", list(code= paste("$('#",id,"').modal('show')" ,sep=""))) } hideModal <- function(id,session) { session$sendCustomMessage(type="jsCode", list(code= paste("$('#",id,"').modal('hide')" ,sep=""))) } 

Appelez la fonction showModal avant votre fonction Call et la fonction hideModal après!

J'espère que cela t'aides.

Seb