R 一个动作按钮有两个闪亮的输出

R Shiny Two Outputs for One Action Button

我正在尝试使用 R Shiny 中的操作按钮来启动慢速 运行 JAGS 模型。我希望在用户第一次点击显示他们按下按钮的时间的按钮时出现一些文本,以便他们知道发生了什么事情。

到目前为止,操作按钮可以正常工作,但它会等到慢速 运行 模型完成后才会显示模型输出和文本。

我查看了以下问题,但它们似乎没有回答我的问题,至少没有以我理解的方式回答: Pattern for triggering a series of Shiny actions

我是 Shiny 的新手,所以我希望这是一个简单的问题。

Run.me <- function(a){
# some fake slow function
# This actually takes about 8 hours in real life 

for (i in 2:a) {
Foo[i] <<- Foo[i-1] + sample(1:20,1)
}}

library(shiny)

定义服务器逻辑----

server <- function(input, output) {

observeEvent(input$runmodel, {
output$model.running <- renderText({paste("Model started at", Sys.time())})
})

observeEvent(input$runmodel, {
Foo <<- rep(1, 1e6)
Run.me(1e6)
output$model.ran <- renderTable({head(Foo)})
})

}

定义UI----

ui <- fluidPage(

fluidRow(
column(5, align = "center",
       actionButton("runmodel", "Run the Model")),
textOutput("model.running")
),


fluidRow(
column(5, align = "center", tableOutput("model.ran"))
)
)

运行 应用程序----

shinyApp(ui = ui, server = server)

在我的应用程序中,它也在慢慢构建模型,我在服务器中使用了一个进度条。我知道这不是您所要求的,但您可能会发现这是一个可以接受的解决方案。

modeloutput= reactive(withProgress(message = 'Generating JAGs model', value = 0, {
    incProgress(50); generate_jags(params)
}))

output$jags = renderPlot(modeloutput())

我也会关注这个问题的答案,因为我也更喜欢在实际绘图中有消息或加载栏的解决方案 window 输出将出现的地方。

我还找到了另一种解决方案,该解决方案的工作原理是在单击操作按钮后屏蔽它,并且有一个小的加载栏和完成消息。可在此处获得:

https://github.com/daattali/advanced-shiny/tree/master/busy-indicator

一个可能性,如果我正确理解问题:

server <- function(input, output) {

  observeEvent(input$runmodel, {
    Foo <<- rep(1, 1e6)
    Run.me(1e6)
    output$modelran <- renderTable({head(Foo)})
  })

}

js <- "
$(document).ready(function() {
  $('#runmodel').on('click', function(){
    var date = new Date().toLocaleString();
    $('#busy').html('Model started: ' + date);
  });
  $('#modelran').on('shiny:value', function(event) {
    $('#busy').html('');
  });
});
"

ui <- fluidPage(
  tags$head(
    tags$script(HTML(js))
  ),

  fluidRow(
    column(5, align = "center",
           actionButton("runmodel", "Run the Model")),
    tags$p(id = "busy")
  ),
  fluidRow(
    column(5, align = "center", tableOutput("modelran"))
  )

)