闪亮的倒数计时器然后触发

Shiny countdown timer then trigger

我使用以下代码在单击按钮后进行 3 秒倒计时。我希望输出更改为其他内容,例如 "Countdown finished" 一旦倒计时达到 0。

如何实时收听倒计时输出(不是输入)以查看倒计时何时达到 0 并触发其他内容?

library(shiny)
library(shinyjs)

ui <- fluidPage(
  actionButton("do", "Click Me"),
  verbatimTextOutput("eventTimeRemaining")
)

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


  observeEvent(input$do, {

    EventTime <- Sys.time() + 3


    output$eventTimeRemaining <- renderText({
            invalidateLater(1000, session)
            round(difftime(EventTime, Sys.time(), units='secs'))
                                            })

  })



}

shinyApp(ui, server)

TLDR:使 EventTime 反应

需要注意一件事,按照您现在的设置方式,每次触发 observeEvent 时都会重新创建输出。您真正想要的是根据某些触发器进行更新。这是服务器功能的代码:

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

  EventTime <- reactiveVal()

  observeEvent(input$do,{
    EventTime(Sys.time() + 3)
  })

  output$eventTimeRemaining <- renderText({

    req(input$do)

    timeLeft <- round(difftime(EventTime(), Sys.time(), units='secs'))

    if(timeLeft > 0){
      invalidateLater(1000, session)
      msg <- timeLeft
    } else {
      msg <- "<Time expired message>"
    }

    msg

  })

}

这是怎么回事:设置文本输出,但 req 将阻止显示任何内容,直到至少单击输入按钮一次。当输入按钮被点击时,时间被捕获在 EventTime reactive 中。这反过来(连同点击)触发对文本输出的更新。如果还有时间,消息会显示时间并将输出设置为在一秒后失效。如果时间到期,将显示您的最终消息,重要的是,输出将停止更新(至少在再次单击按钮之前)。