我有一个R Shinyweb页面,它接收用户输入,按用户输入查询Postgres数据库,然后绘制信息。我正在尝试向Shiny应用程序添加状态栏。
但是,我的问题是我不知道查询执行需要多长时间。查询执行时间取决于用户输入。
有没有办法可以连续循环状态栏直到查询完成?如果是这样,我如何跟踪查询的完成情况?
以下是示例代码。 '图中的线(rnorm(as.numeric(输入$ n_breaks)))'是我的代码中的实际SQL查询。执行此行的时间未知。我不是在寻找实际的代码。我只需要了解如何实施这一概念。
library(shiny)
mycss <- "
#plot-container {
position: relative;
}
#loading-spinner {
position: absolute;
left: 50%;
top: 50%;
z-index: -1;
margin-top: -33px; /* half of the spinner's height */
margin-left: -33px; /* half of the spinner's width */
}
#plot.recalculating {
z-index: -2;
}
"
ui <- fluidPage(
tags$head(tags$style(HTML(mycss))),
actionButton("btn", "Plot (takes 2 seconds)"),
selectInput(inputId = "n_breaks",
label = "Select number of points",
choices = c(100, 1000, 10000, 100000),
selected = 100),
div(id = "plot-container",
tags$img(src = "spinner.gif",
id = "loading-spinner"),
plotOutput("plot")
)
)
server <- function(input, output, session) {
output$plot <- renderPlot({
input$btn
i = 0
while (i==0) {
Sys.sleep(1)
plot(rnorm(as.numeric(input$n_breaks)))
i = 1
}
})
}
shinyApp(ui,server)
答案 0 :(得分:0)
我通过以下链接找到答案:
https://shiny.rstudio.com/articles/progress.html
基本上,如果进度函数调用另一个函数来执行长时间运行的计算,则无法完成此操作。我们能做的最好的事情是将它设置为起始值,比方说0.3,然后在完成时将其移动到1。例如,如果函数位于外部包中,则也可能是这样。