Таймер обратного отсчета - PullRequest
0 голосов
/ 06 марта 2020

Я использую следующий код для 3-секундного обратного отсчета после нажатия кнопки. Я хотел бы, чтобы вывод изменился на что-то другое, например, «Обратный отсчет завершен», как только обратный отсчет достигнет 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)

1 Ответ

0 голосов
/ 06 марта 2020

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 реактив. Это в свою очередь (наряду с щелчком) вызывает обновление текста. Если еще осталось время, сообщение отображает время и устанавливает вывод для аннулирования секунды позже. Если время истекло, отображается ваше последнее сообщение и, что важно, выходной сигнал перестает обновляться (по крайней мере, пока кнопка не будет нажата снова).

...