闪亮的倒数计时器然后触发
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 中。这反过来(连同点击)触发对文本输出的更新。如果还有时间,消息会显示时间并将输出设置为在一秒后失效。如果时间到期,将显示您的最终消息,重要的是,输出将停止更新(至少在再次单击按钮之前)。
我使用以下代码在单击按钮后进行 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 中。这反过来(连同点击)触发对文本输出的更新。如果还有时间,消息会显示时间并将输出设置为在一秒后失效。如果时间到期,将显示您的最终消息,重要的是,输出将停止更新(至少在再次单击按钮之前)。