按下按钮后,每隔几秒就有一个闪亮的应用程序

时间:2018-01-26 23:56:42

标签: r plot shiny

我想构建一个应用程序,在按下按钮后开始绘图,它将继续绘制(在图形之间有一些时间),直到for循环结束。计算绘制内容的函数相当复杂,因此我将提供一个基本R的最小工作示例,我希望以闪亮的方式运行。我再也不确定如何解决这个问题,因此我无法根据server.rui.r提供代码。

for (i in 1:10){
    A <- matrix(nrow=5,ncol =5,sample(3,size =25,replace=T))
    Sys.sleep(0.3)
    image(A,xaxt='n', ann=FALSE,yaxt='n',bty="n",asp=1)
}

我该如何处理?

我想我能够让自己的进度条工作,但连续的策划阻止我做任何事情。

1 个答案:

答案 0 :(得分:0)

嗯,我想我是白痴,我发现了一个类似的问题discussed here(在发布这个帖子后30分钟),我能够调整代码。希望这可以帮助将来的某个人。

library(shiny)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  tags$style(type="text/css",
             ".recalculating {opacity: 1.0;}"),
      mainPanel(
        actionButton("Start","START", width='100%'),
        plotOutput("A")
      )
   )


server <- function(input, output, session) {
  par(bg = 'black')
  maxIter <- 5
  vals <- reactiveValues( A = matrix(nrow=5,ncol =5,sample(3,size =25,replace=T)),counter = 1)
  observeEvent(input$Start, {
    vals$counter <- 1 
    shinyjs::disable("Start")
    output$A <- renderPlot({
       Sys.sleep(0.5)
       image(vals$A,xaxt='n', ann=FALSE,yaxt='n',bty="n",asp=1)

       })


  })

     observeEvent(input$Start, {
                                observe({
                                        isolate({
                                              vals$A <- matrix(nrow=5,ncol =5,sample(3,size =25,replace=T))
                                              vals$counter <- vals$counter + 1 #for loop

                                              })

                                        if (isolate(vals$counter) <= maxIter) 
                                                invalidateLater(0, session)
                                        })
                                  })
     observe({vals$counter
       if (vals$counter > maxIter)
         shinyjs::enable("Start")
       })
}
shinyApp(ui = ui, server = server)