重置闪亮的反应式计时器

时间:2019-01-28 14:01:52

标签: r shiny

我想将反应式计时器重置为零,然后再次开始计数到10000。

如果您在10秒钟内按下重置按钮,则永远不会打印“定时器触发”。

我认为这可能有效,但是没有。

require('shiny')
if (interactive()) {

  ui <- fluidPage(
    actionButton("reset_button", "Reset")
  )


  server <- function(input, output) {

    autoInvalidate <- reactiveTimer(10000)

    observe({
      autoInvalidate()
      print ("timer fires")      

    })

    observeEvent(input$reset_button, 
     {
       autoInvalidate <- reactiveTimer(10000)
       print("reset")
     }
    )

  }

  shinyApp(ui, server)
}

2 个答案:

答案 0 :(得分:1)

这应该做:

library(shiny)
ui <- fluidPage(
  actionButton("reset_button", "Reset"),
  textOutput("text")
)

server <- function(input, output, session) {

  v <- reactiveValues(timer = Sys.time()+5)

  observe({
    invalidateLater(100)
    if(v$timer <= Sys.time()){
      v$timer <- Sys.time()+5
      print("timer fires") 
    }
  })

  observeEvent(input$reset_button,{
    v$timer <- Sys.time()+5
    print("reset")
  })

}
shinyApp(ui, server)

答案 1 :(得分:0)

我不是100%肯定我了解您想要的行为。如果您按“重置”,则计时器应重新从0开始,否则不应打印“计时器触发”。因为使用reactiveTimerinvalidateLater,您的代码将每x毫秒重新执行一次。

我想出了这个小例子。如果希望在按下“重置”时不显示“定时器触发”,则必须包括loopit()部分。如果您只想重置计时器,请使用loopit()删除行。

require('shiny')
if (interactive()) {

  ui <- fluidPage(
    actionButton("reset_button", "Reset")
  )


  start = Sys.time()
  n=10000

  server <- function(input, output) {
    loopit <- reactiveVal(TRUE)

    observe({
      invalidateLater(n)
      if (loopit()) {
        print(paste("start: ", start))
        if (Sys.time() > start+(n/1000)) {
          print ("timer fires")      
        } 
      }
    })

    observeEvent(input$reset_button, {
      start <<- Sys.time()
      loopit(FALSE)
      print("reset")
    })
  }

  shinyApp(ui, server)
}