每个星期一在 Shiny 中安排一个任务(更新数据)

Schedule a task (update data) each monday in Shiny

我在 Shiny Server pro 中有一个显示不同分析的仪表板。数据来自大约需要 20 分钟才能完成的长查询。

在我当前的设置中,我有一个更新数据的按钮:

  1. 查询新数据
  2. 转换数据
  3. 将数据保存在文件 .RData
  4. 将数据保存在全局对象中(使用data <<-

以防万一,在服务器和 ui 函数之外,我有一个检查数据对象是否存在的语句。如果不存在,它会从 .RData 文件中读取数据,而不是再次进行查询。

现在我想每周一在 5:00pm 更新数据(我不想每周一打开应用程序并按下按钮)。我认为最好的方法是使用 cronR 使用 cron 作业。该代码将位于服务器和 ui 函数之外的 app.R 中。现在我有以下问题:

  1. 如果我使用 Shiny server pro 多少次,如果应用程序位于服务器外部 app.R 并且具有 ui 功能,它会创建 cron 作业吗?
  2. 如何替换 shiny 应用程序中的对象 data?这样一来,如果用户在星期一下午 5:00 之后打开应用程序,数据将就位,无需读取 .RData 文件,当然也不会再次执行查询。
  3. 最佳做法是什么?

我看不到你的观点 1. 如果应用程序没有命名为“global.R”或“ui.R”或“server.R”,则该应用程序不会创建 cron 作业, 我认为。此外,您不必将代码放在 /srv/shiny-server/ 目录下。

对于您的第 2 点,请检查 shiny 库中的 reactiveFileReader 函数。此函数检查文件的最后修改时间,如果更改则重新读取文件

data <- reactiveFileReader(5*60*1000, filePath="NewData.Rda", readFunc = load) 

只需完全在闪亮的应用程序之外使用 cronR 创建您的 cron 进程,并确保它将您的数据保存到正确的位置。

创建获取数据的 R 代码:

library(...)
# ...
# x <- mydata
save(x, file = "NewData.Rda")

创建 cron 作业:

cmd <- cron_rscript("path/to/getdata.R")
cron_add(cmd, frequency = 'daily', id = 'job5', at = '05:00')