Я бы создал отдельный вывод в ui
, например imageOutput
, чтобы показать ваше изображение. Кроме того, я бы сделал timeLeft
отдельным выражением reactive
, на которое могут ссылаться как eventTimeRemaining
для отображения обратного отсчета, так и msg
(создано отдельное output
).
Я не был уверен, как вы хотите обработать начальное условие - я установил значение по умолчанию EventTime
на Sys.time()
, но если вы используете NULL или не инициализируете, тогда нужно будет проверить NULL в output
и timeLeft
расчет.
library(shiny)
library(shinyjs)
ui <- fluidPage(
actionButton("do", "Click Me"),
verbatimTextOutput("eventTimeRemaining"),
imageOutput("msg")
)
server <- function(input, output, session) {
EventTime <- reactiveVal(Sys.time())
observeEvent(input$do,{
EventTime(Sys.time() + 3)
})
timeLeft <- reactive({
tl <- round(difftime(EventTime(), Sys.time(), units='secs'))
if (tl > 0) {
invalidateLater(1000, session)
}
tl
})
output$eventTimeRemaining <- renderText({
timeLeft()
})
output$msg <- renderImage({
if (timeLeft() > 0) {
list(src = '')
} else {
list(src = './sing.jpg')
}
}, deleteFile = FALSE)
}
shinyApp(ui, server)