有没有一种方法可以显示在Shiny中构建的图,而不是等待所有图?

合作社

我有一个包含许多情节的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以显示Go包的依赖关系图?

有没有一种方法可以使用plotly在python中创建范围图?

有没有一种方法可以使tabPanel中的R图居中闪亮?

有没有一种方法可以递归地等待Java中的值?

有没有一种简单的方法可以在matplotlib中构建堆积的条形图?

有没有一种方法可以通过别名来缩短(而不是删除)终端中显示的路径

有没有一种方法可以使用Seaborn对同一图形使用多个子图?

有没有一种方法可以在颤动中显示文本内部的图像

有没有一种方法可以在RStudio Viewer中显示多个表?

有没有一种方法可以在PropertyGrid中显示静态属性?

有没有一种方法可以在QTextEdit中显示堆叠的文本

有没有一种方法可以在Excel中显示动态行数?

在ActiveAdmin中,有没有一种方法可以显示关联的nil模型?

有没有一种方法可以动态创建迹线,例如用于堆积的条形图?

有没有一种方法可以限制Python SEaborn条形图(或任何图表)的结果数量?

有没有一种方法可以将条形图(matplotlib)覆盖在地图(geopandas)上?

有没有一种方法可以将从Spatstat的K函数获得的图转换为ggplot或grob?

有没有一种方法可以根据力导向图的不同数据添加不同的形状?

有没有一种方法可以将条形图与时间线动画进行分组?

在R中:有没有一种方法可以绘制具有不同长度的两组节点的图?

有没有一种方法可以在一个视图中显示所有Sylius产品?

有没有一种方法可以打印对象的所有方法?

有没有一种方法可以记录所有DOM方法调用

有没有一种方法可以等待TPL任务而不会引发异常?

有没有一种方法可以显示或列出子控件的所有父容器?

有没有一种方法可以将matplotlib图绘制到其他一些2D渲染库中的窗口?

有没有一种方法可以避免在Gatsby中构建具有某些路径的页面?

有没有一种方法可以在构建之前向用户显示动态信息?

有没有一种方法可以获取所有堆userptr的userstack