在Rshiny 中,我想创建一个动画,它由一个动作按钮启动,并可以被另一个动作按钮中断.以下是不起作用的代码的虚拟版本.目标是开始一次迭代,每秒打印一次Year=Year+1,直到它达到最大值.然而,用户也应该能够使用停止按钮来中断该过程.
例如,我之所以使用观察事件()、观察()和reactive veValues()构造而不是for循环,是因为我无法停止由Start按钮启动的循环.
在本例中,启动或停止函数都不起作用.使用for循环,我让迭代开始,但Stop按钮仅在迭代结束时"停止"该过程.在for循环中包含observeEvent(input$stop, { break })
的构造不起作用.我猜原因是,只有在执行for循环之后才能观察到该事件,因为在此之前,前一个进程仍处于活动状态.
shinyApp(
ui=fluidPage(
actionButton("start", "Start"),
actionButton("stop", "Stop"),
actionButton("reset", "Reset"),
verbatimTextOutput("text")
),
server=function(input, output, session) {
r <- reactiveValues(animation = FALSE, year=2000)
observeEvent(input$start, {
r$animation <- TRUE
})
observeEvent(input$stop, {
r$animation <- FALSE
})
observeEvent(input$reset, {
r$animation <- FALSE
r$year <- 2000
})
observe({
if(isTRUE(r$animation)) {
r$year <- r$year + 1
Sys.sleep(1)
if(r$year==2005) {
r$animation <- FALSE
r$year <- 2000
}
}
})
output$text <- renderText({ paste0("It is year ", r$year) })
})