我有一个包含许多情节的Shiny Dashboard,所有情节都需要花费几秒钟来构建。一旦最后一个生成,它们都将显示。我会尽快完成它,而不是像每个情节显示。我知道R是单线程的,但似乎必须要有一种“将执行返回到显示代码”的方法。
此代码演示了该问题:
library(shiny)
ui <- fluidPage(
title = "Page loading test"
, h1("Page loading test")
, plotOutput("plot1")
, plotOutput("plot2")
, plotOutput("plot3")
, plotOutput("plot4")
)
server <- function(input, output) {
output$plot1 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot2 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot3 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
output$plot4 <- renderPlot({
Sys.sleep(10)
plot(rnorm(50))
})
}
shinyApp(ui = ui, server = server)
睡眠只是为了模拟执行缓慢。
页面显示需要40秒钟。我想在网页采取10秒,以显示plot1,再追加10秒,以显示plot2等有没有像UpdatePage(),它可以在每个小区的底层函数被调用电话吗?
在我的页面上,我正在加载动画,以便用户知道正在发生的活动,这使得它们在一次加载时更加明显。
我可以,当然,有一个简单的页面,但随后它不会是一个仪表板。:)
您可以使用reactiveTimer()
定期刷新页面。
并且你可以救你的地块的list
地块立即打印出来,在每次刷新。
我不得不重新排序renderPlot
功能,所以step
迭代器只呈现一次一个阴谋
另外,我选择不立即开始第一个渲染以绘制“加载”图。
library(shiny)
ui <- fluidPage(
title = "Page loading test"
, h1("Page loading test")
, plotOutput("plot1")
, plotOutput("plot2")
, plotOutput("plot3")
, plotOutput("plot4")
)
# Loading plot
plot(-1:1, -1:1, type = "n", xlab = "", ylab = "")
text(0,0, "Loading",cex = 5)
loading <- recordPlot()
plotlist <- vector("list",4)
step <- 0 # which plot should be rendered next
server <- function(input, output, session) {
autoInvalidate <- reactiveTimer(10, session)
output$plot4 <- renderPlot({autoInvalidate();
if(step>4){plotlist[[4]]}
else if(step==4){step <<- step+1
print("rendering step 4")
Sys.sleep(10)
plotlist[[4]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot3 <- renderPlot({autoInvalidate();
if(step>3){plotlist[[3]]}
else if(step==3){step <<- step+1
print("rendering step 3")
Sys.sleep(10)
plotlist[[3]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot2 <- renderPlot({autoInvalidate();
if(step>2){plotlist[[2]]}
else if(step==2){step <<- step+1
print("rendering step 2")
Sys.sleep(10)
plotlist[[2]] <<- {plot(rnorm(50));recordPlot()}} else loading
})
output$plot1 <- renderPlot({autoInvalidate();
if(step>1){plotlist[[1]]}
else if(step==1){step <<- step+1
print("rendering step 1")
Sys.sleep(10)
plotlist[[1]] <<- {plot(rnorm(50));recordPlot()}} else {step <<-1;loading}
})
}
shinyApp(ui = ui, server = server)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句