闪亮的文本输出在SQL查询结束时进行更新

时间:2019-05-02 14:40:16

标签: r shiny

我有一个问题,这里已经用不同的方式讨论了这个问题,但是显然不能满足我的非常简单的需求。

我有一个简单的应用程序,可以调用SQL数据库。我使用一个按钮来启动查询。 我只需要显示“单击按钮”的文本即可从一开始就下载。 用户单击按钮后,我需要此输出文本来显示“正在下载数据,请稍候”。

查询完成并且数据已完全接收后,我将需要输出文本来显示“数据下载成功”。

我已经看到some solutions是基于进度条的,但是由于我没有经历data.frame,所以无法使用它。我查询数据库,我不知道这可能需要多长时间。 我已经看到other solutions基于反应性值,但是在这种情况下,文本输出应根据数据框的大小做出反应(0行并单击按钮->仍在下载数据;> 0行并单击按钮“数据下载成功”。

因此,我被困在这里。 这是我的简单代码,但理想情况下可以满足我的需求。

ui <- fluidPage(
  fluidRow(actionButton("download_btn", "Download Data")),
  fluidRow(textOutput(outputId = "load_data_status")),
  fluidRow(dataTableOutput("output_table"))
)

server <- function(input, output) {
  cat("\n output$output_table = \n", output$output_table)

  data <- eventReactive(input$download_btn,{
    output$load_data_status <- renderText({ "Downloading data from Server. Please wait..." })
    # here I actually download the data from a database and this could take several seconds
    df <- data.frame(mtcars)
    output$load_data_status <- renderText({ "Data downloaded succesfully." })
    df
  })

  output$output_table <- renderDataTable({
    data()
  })

}
shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

选项A:

以下是Dean Attali的一个很好的解决方案:https://github.com/daattali/advanced-shiny/tree/master/busy-indicator

选项B:

您可以收听 JavaScript 事件,以:

  1. 单击按钮时更改文本
  2. 渲染输出后再次更改文本

我还添加了Sys.sleep()以模拟一些加载时间。

代码:

library(shiny)

ui <- fluidPage(
  tags$head(tags$script(HTML('
    // 1. Change text to "Downloading..." when button is clicked
    $(document).on("shiny:inputchanged", function(event) {
      if (event.name === "download_btn") {
        $("#download_btn").html("Downloading data from Server. Please wait...");
      }
    });

    //. 2. Change text to "Success" when output table is changed
    $(document).on("shiny:value", function(event) {
      if (event.name === "output_table") {
        $("#download_btn").html("Data downloaded succesfully.");
      }
    });        
  '))),
  fluidRow(actionButton("download_btn", "Download Data")),
  fluidRow(DT::dataTableOutput("output_table"))
)

server <- function(input, output) {

  data <- eventReactive(input$download_btn,{
    df <- data.frame(mtcars)
    Sys.sleep(3) # Simulate some loading time

    df
  })

  output$output_table <- renderDataTable({
    data()
  })

}

shinyApp(ui, server)

输出:

output