【问题标题】:Download CSV in Shiny app every 24 hours & display download time每 24 小时在 Shiny 应用程序中下载 CSV 并显示下载时间
【发布时间】:2021-07-06 06:33:50
【问题描述】:

我有一个要下载的 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")

【问题讨论】:

    标签: r csv shiny


    【解决方案1】:

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

    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 作业,以下载并覆盖文件。

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

    【讨论】:

    • 感谢您的快速回答。我明白 1. 在做什么,但我不明白我怎么能看到它。什么代码实际上会输出时差?此代码错误:file.info(lol2021)["mtime"][[1]]。至于 2,这只是将托管在 shinyapps.io 上。这只是我正在实践的一个项目,可能不会同时有多个用户。
    • 您忘记引号了吗?我使用了file.info("lol2021"),而不是file.info(lol2021)。由于您将其放在 shinyapps.io 上,我认为我的第一个建议可能是目前最简单的建议。
    猜你喜欢
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多