Сбросить блестящий реактивный таймер - PullRequest
0 голосов
/ 28 января 2019

Я хочу сбросить реактивный таймер на ноль и снова начать считать до 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 голосов
/ 28 января 2019

Я не уверен на 100%, понимаю ли я желаемое поведение.Если вы нажмете «сброс», если таймер снова запустится с 0, или «таймеры сработают», никогда не будут напечатаны.Потому что с reactiveTimer или invalidateLater ваш код будет повторяться каждые x миллисекунд.

Я придумал этот маленький пример.Если вы хотите, чтобы «таймер срабатывания» никогда не появлялся при нажатии «reset», вы должны включить часть 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)
}
0 голосов
/ 28 января 2019

Это должно сделать:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...