首页 > 解决方案 > 如何在给定时间而不是在计时器上更新反应函数?

问题描述

我希望正在运行的闪亮应用程序在指定时间更新数据,每次系统中的分钟数都是 15 的倍数(例如:12:00、12:15、12:30、12:45、13:00、 13:15 等)。我目前使用每 15 分钟触发一次的反应计时器,但这并不能解决我的问题。如何仅在系统时间变为 15 的倍数时更新应用程序?

标签: rshinyshinyapps

解决方案


获取当前时间,确定下一次刷新前的时间量,并invalidateLater()适当调用。

例如,以下闪亮的应用程序每 15 秒的倍数刷新时钟:

library(shiny)

ui <- fluidPage(
    mainPanel(
        textOutput('time')
    )
)

server <- function(input, output) {
    output$time <- renderText({
        time <- as.integer(format(Sys.time(), "%S"))
        invalidateLater((15 - time %% 15) * 1000)
        format(Sys.time(), "%H:%M:%S")
    })
}

shinyApp(ui = ui, server = server)

编辑: 自上次编辑以来,我稍微简化了计算。time <- as.integer(format(Sys.time(), "%S"))只需获取当前时间的第二部分。我们计算这个秒数 MODULO 15 ( time %% 15) 以获得最后 15 秒倍数之后的秒数。然后我们从 15 中减去该值,以获得下一个倍数之前的秒数。由于时间必须以毫秒为单位,我们将结果乘以 1000。


推荐阅读