我有一个问题,这里已经用不同的方式讨论了这个问题,但是显然不能满足我的非常简单的需求。
我有一个简单的应用程序,可以调用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)
答案 0 :(得分:1)
以下是Dean Attali的一个很好的解决方案:https://github.com/daattali/advanced-shiny/tree/master/busy-indicator
您可以收听 JavaScript 事件,以:
我还添加了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)