如何在Shiny中存储数据并设置定期更新,解决数据源访问超时问题
解决方案
完全可以实现「本地缓存+定期自动更新」的功能,最优实现逻辑为缓存优先、过期刷新、异常降级,既适配数据源数月更新的低频特性,也能解决外部站点临时不可用的问题,具体实现如下:
核心逻辑
- 首次运行时拉取远端数据,存储到本地作为缓存
- 后续运行优先读取本地缓存,无需每次请求远端站点
- 当本地缓存距离上次更新超过设定阈值(比如90天,匹配数据源更新频率)时,才尝试拉取新数据更新缓存
- 若远端站点请求失败(超时/不可用),直接使用本地缓存兜底,不打断Shiny应用运行
可直接复用的代码
library(data.table) # 自定义配置项 cache_file <- "mei_data_local.csv" # 本地缓存文件路径 update_interval_days <- 90 # 自动更新周期,可根据数据源更新频率调整 dM1 <- tryCatch({ # 缓存存在且未过期,直接读本地 if (file.exists(cache_file)) { cache_last_update <- file.info(cache_file)$mtime if (difftime(Sys.time(), cache_last_update, units = "days") < update_interval_days) { return(fread(cache_file)) } } # 缓存不存在/已过期,拉取新数据 new_data <- fread('https://psl.noaa.gov/data/correlation/mei.data', header = FALSE, fill = TRUE) # 更新本地缓存 fwrite(new_data, cache_file) new_data }, error = function(err) { # 拉取失败时兜底逻辑 if (file.exists(cache_file)) { warning("数据源站点暂不可用,已加载本地缓存数据") return(fread(cache_file)) } stop("首次运行无本地缓存,且数据源站点无法访问,请稍后重试") })
部署可选优化
如果你的Shiny应用部署在Linux服务器上,可以额外配置cron定时任务,每3个月自动执行一次数据拉取脚本更新缓存,无需等待用户访问应用时触发更新,稳定性更强。
内容的提问来源于stack exchange,提问作者Vishnupriya
相关产品推荐
相关产品推荐

