Rshiny:function运行时显示“加载…”信息

我使用Shiny GUI R软件包。 我正在寻找一种方法来显示消息,如“loading …”在actionButton被按下后。 该函数需要几分钟才能执行,所以我需要以某种方式通知用户该button实际上触发了一些事件。 现在server.R代码如下所示:

DATA <- reactive({ if(input$DownloadButton>0) { RunDownload() } else { NULL } }) output$Download <- renderText({ if(NROW(DATA())>0) { paste0(Sys.time(),": ",NROW(DATA()), " items downloaded") } else { '' } }) 

actionButton()是一个从互联网上下载数据的函数。 input$DownloadButton是actionButton。 所以按下button后,用户等待几分钟,然后才看到一条消息,说明下载成功。 我想在按下actionButton之后显示一条消息“正在加载…”,然后执行另一条消息,如paste0(Sys.time(),": ",NROW(DATA()), " items downloaded")结束。

我已经使用了比我之前发布的更简单,更可靠的方法。

一个组合

 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; } ") 

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

例:

 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)) }) } )) 

标签$ head()不是必需的,但将head标签中的所有样式保留是一个好习惯。

我通过将以下代码添加到sidebarPanel()来解决问题:

 HTML('<script type="text/javascript"> $(document).ready(function() { $("#DownloadButton").click(function() { $("#Download").text("Loading..."); }); }); </script> ') 

我find了一个解决scheme,对我来说工作正常。 我正在使用Bootstrap模式。 当函数的执行开始时显示,并在结束时再次隐藏。

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) } 

要显示和隐藏它使用的function

 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=""))) } 

在调用函数之前调用showModal函数,然后调用hideModal函数!

希望这可以帮助。

勒布

你可以使用ShinyJS: https : //github.com/daattali/shinyjs

当按下actionButton时,您可以轻松切换显示“加载…”的文本组件,并在计算完成后,可以将此组件切换到隐藏状态。