如何在给定时间而不是在计时器上更新反应函数?

how to update reactive functions at a given time and not on a timer?

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

获取当前时间,确定距下一次刷新还有多少时间,并适当地调用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")) 只是获取当前时间的 second-part。我们计算此秒数 MODULO 15 (time %% 15) 以获得最后 15 秒倍数后的秒数。然后我们从 15 中减去该值以获得下一个倍数之前的秒数。由于时间必须以毫秒为单位,因此我们将结果乘以 1000。