首页 > 解决方案 > 每 24 小时在 Shiny 应用程序中下载 CSV 并显示下载时间

问题描述

我有一个要下载的 CSV。我不希望每次用户加入或使用该应用程序时都下载它。

我想每 24 小时运行一次代码,并显示 1)自上次下载以来的计时器 2)直到下次下载的计时器 3)上次下载的时间戳

以下是我现在拥有的,它有效,但可能会导致不必要的下载。用 invalidatelater 做某事会起作用还是有更好的方法?

CSV.Path <- "https://oracleselixir-downloadable-match-data.s3-us-west-2.amazonaws.com/2021_LoL_esports_match_data_from_OraclesElixir_20210404.csv"
download.file(CSV.Path, "lol2021")
lol2021 <- read.csv("lol2021")

标签: rcsvshiny

解决方案


有两种方法可以解决这个问题:

  1. 检查应用程序启动时是否应该下载它;如果文件更新时间超过 24 小时,请不要重新下载。这可以通过以下方式轻松解决:

    fileage <- difftime(Sys.time(), file.info("data")["mtime"][[1]], units = "day")
    if (is.na(fileage) || fileage > 1) {
      CSV.Path <- "https://oracleselixir-downloadable-match-data.s3-us-west-2.amazonaws.com/2021_LoL_esports_match_data_from_OraclesElixir_20210404.csv"
      download.file(CSV.Path, "lol2021")
    }
    lol2021 <- read.csv("lol2021")
    

    is.na如果文件不存在,则存在。)

    一个复杂的因素是两个同时的用户可能会尝试同时下载它。如果可能的话,这里应该有一些互斥文件访问控制。

  2. 确保此脚本每 24 小时运行一次,无论哪些用户正在使用或未使用该应用程序。您在什么类型的服务器上运行此应用程序?我相信,像 shiny-server 这样的东西不会像 cron 一样运行,而且你可能无法保证应用程序每 24 小时都“唤醒”。RStudio Connect 确实允许计划作业,这可能是您的考虑因素。

    缺少这一点,如果您可以很好地访问服务器,则可以使用Rscript或类似的方式将其添加为 cron 作业,以下载和覆盖文件。

关于互斥文件访问的注意事项:许多网络文件系统(在云和服务器架构中很常见)不保证文件锁定。一种常见的技术是下载到一个临时文件中,然后一步将这个临时文件移动(或复制)到“真实”文件名中。这可以防止一个进程正在读取文件而另一个进程正在写入文件的可能性......部分文件读取将是一个令人沮丧且难以重现的错误。


推荐阅读