【问题标题】:Reset shiny reactive timer重置闪亮的反应计时器
【发布时间】:2019-01-28 14:01:52
【问题描述】:

我想将反应计时器重置为零并再次开始计数到 ​​10000。

如果您在 10 秒内按下重置按钮,则永远不会打印“timer fires”。

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

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)
}

【问题讨论】:

标签: r shiny


【解决方案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)

【讨论】:

  • 这将立即触发“观察”并重新执行它,同样在按下“重置”之后。我不确定所需的行为应该是什么,但我认为 OP 的第 1 行和第 2 行以某种方式相互矛盾。
  • 这种方法对我来说效果很好。也许您正在考虑observe() 是如何失效并在使用重置按钮更改v$timer 时重新评估的?确实如此,但如果计时器值仍在未来,则 if() 条件为假,因此,没有任何事情发生,如预期的那样。
【解决方案2】:

我不是 100% 确定我理解您想要的行为。如果您按下“重置”,计时器应该再次从 0 开始,或者“计​​时器触发”永远不会被打印。因为使用reactiveTimerinvalidateLater,您的代码将每x 毫秒重新执行一次。

我想出了这个小例子。如果您希望在按下“reset”时永远不会出现“timer fires”,则必须包含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)
}

【讨论】:

    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2017-11-30
    • 2015-06-23
    • 2014-08-23
    • 2020-10-13
    • 2016-02-22
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多