闪亮应用程序在指定时间检查某些内容

时间:2017-10-23 17:40:35

标签: r vbscript shiny

我想知道是否有办法让Shiny在每天的指定时间检查一下它是否正在运行。现在我知道这不推荐,我已经通读了

  1. Schedule task on a shiny application
  2. Schedule R script using cron
  3. call myFunction daily, at specific time, in shiny?
  4. 以及我知道Shiny中的reactiveTimer函数。但是,我已经开发并部署了我的Shiny App作为桌面应用而不是网址,因此我的同事们喜欢把它打开。以下是我尝试的基本示例:

    library(shiny)
    ui <- fluidPage()
    server <- function(input, output, session) {
      test <- reactiveValues(value = format(as.POSIXlt(Sys.time()), "%H:%M"))
      observeEvent(test$value == "7:15", {
        stopApp()
      })
    }
    
    shinyApp(ui, server)
    

    我希望应用程序在预定时间停止的原因是因为我希望应用程序检查更新并在更新后重新启动。我想它应该停止,如果它们是要更新的东西,但上面是我想要完成的更简单的想法。

    无论如何都要在特定时间执行某些代码吗?我知道reactiveTimer是一个选项,但它会在指定的时间后执行任务,但不会在每天的特定时间执行。

    另一种选择是,如果我可以获得一个vbs脚本,甚至只是一个不同的r脚本来关闭Shiny App,但我也无法弄清楚如何做到这一点。任何建议或想法都将是一个很大的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

This does the trick (a little verbose, but works)
You need to set the variable timeStop (HH:MM:SS)

library(shiny)
ui <- fluidPage(
  uiOutput("info")
)
server <- function(input, output, session) {

  ## Variable to set the time when app stops automatically (HH:MM:SS)
  timeStop <- "22:47:20"

  toStop <- as.POSIXct(timeStop, format="%H:%M:%S")
  if (Sys.time() > toStop) {
    toStop <- toStop + 86400
  }
  secsToStop <- round(as.numeric(difftime(toStop, Sys.time(), units = "secs")) * 1000)
  timeToStop <- reactiveTimer(secsToStop)
  trick <- reactiveValues()
  trick$toFire <- FALSE

  observeEvent(timeToStop(), {
    if (trick$toFire) {
      stopApp()
    } else {
      trick$toFire <- TRUE
    }
  })

  output$info <- renderUI({
    h2(paste("App will stop automatically at ", toStop))
  })
}

shinyApp(ui, server)