我想构建一个应用程序,在按下按钮后开始绘图,它将继续绘制(在图形之间有一些时间),直到for循环结束。计算绘制内容的函数相当复杂,因此我将提供一个基本R的最小工作示例,我希望以闪亮的方式运行。我再也不确定如何解决这个问题,因此我无法根据server.r
和ui.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)
}
我该如何处理?
我想我能够让自己的进度条工作,但连续的策划阻止我做任何事情。
答案 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)