每个星期一在 Shiny 中安排一个任务(更新数据)
Schedule a task (update data) each monday in Shiny
我在 Shiny Server pro 中有一个显示不同分析的仪表板。数据来自大约需要 20 分钟才能完成的长查询。
在我当前的设置中,我有一个更新数据的按钮:
- 查询新数据
- 转换数据
- 将数据保存在文件 .RData
- 将数据保存在全局对象中(使用
data <<-
)
以防万一,在服务器和 ui 函数之外,我有一个检查数据对象是否存在的语句。如果不存在,它会从 .RData 文件中读取数据,而不是再次进行查询。
现在我想每周一在 5:00pm 更新数据(我不想每周一打开应用程序并按下按钮)。我认为最好的方法是使用 cronR 使用 cron 作业。该代码将位于服务器和 ui 函数之外的 app.R 中。现在我有以下问题:
- 如果我使用 Shiny server pro 多少次,如果应用程序位于服务器外部 app.R 并且具有 ui 功能,它会创建 cron 作业吗?
- 如何替换 shiny 应用程序中的对象
data
?这样一来,如果用户在星期一下午 5:00 之后打开应用程序,数据将就位,无需读取 .RData 文件,当然也不会再次执行查询。
- 最佳做法是什么?
我看不到你的观点 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')
我在 Shiny Server pro 中有一个显示不同分析的仪表板。数据来自大约需要 20 分钟才能完成的长查询。
在我当前的设置中,我有一个更新数据的按钮:
- 查询新数据
- 转换数据
- 将数据保存在文件 .RData
- 将数据保存在全局对象中(使用
data <<-
)
以防万一,在服务器和 ui 函数之外,我有一个检查数据对象是否存在的语句。如果不存在,它会从 .RData 文件中读取数据,而不是再次进行查询。
现在我想每周一在 5:00pm 更新数据(我不想每周一打开应用程序并按下按钮)。我认为最好的方法是使用 cronR 使用 cron 作业。该代码将位于服务器和 ui 函数之外的 app.R 中。现在我有以下问题:
- 如果我使用 Shiny server pro 多少次,如果应用程序位于服务器外部 app.R 并且具有 ui 功能,它会创建 cron 作业吗?
- 如何替换 shiny 应用程序中的对象
data
?这样一来,如果用户在星期一下午 5:00 之后打开应用程序,数据将就位,无需读取 .RData 文件,当然也不会再次执行查询。 - 最佳做法是什么?
我看不到你的观点 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')