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