我想构建一个应用程序,该应用程序将在按下按钮后开始绘制,并且它会继续绘制(图形之间有一段时间(,直到 for 周期结束。计算要绘制的内容的函数相当复杂,因此我将提供来自基础 R 的最小工作示例,我想在 shiny 中运行。同样,我不确定如何处理这个问题,所以我无法提供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)
}
我应该如何处理这个问题?
我想我自己可以让进度条工作,但连续的阴谋阻止了我做任何事情。
好吧,我想我是个白痴,我发现了这里讨论的类似问题(当然是在发布此内容后 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)