Shiny应用外网月度数据定时更新调度方案求助
Shiny应用第三方数据源高可用及自动更新解决方案
优化逻辑说明
核心解决两个问题:
- 拉取异常时不覆盖本地有效数据,避免站点维护导致应用无数据可用
- 配置月度自动调度,保证本地数据始终为最新可用版本
数据更新脚本优化
在原有逻辑基础上增加异常捕获机制,单数据源拉取失败时跳过该数据源更新,保留本地原有文件:
# 加载依赖包 library(data.table) library(dplyr) # 原有均值计算函数 dMean <- function(d){ dd <- d %>% filter(!between(month, 4, 10)) %>% arrange(Year, month) %>% filter(!(Year == min(Year) & month %in% 1:3 | Year == max(Year) & month %in% 11:12)) %>% group_by(grp = cumsum(month == 11)) %>% summarise(Year = last(Year), value = mean(value)) %>% select(-grp) return(dd) } # GTA数据拉取与存储 tryCatch({ dG1 <- fread('https://www.metoffice.gov.uk/hadobs/hadcrut4/data/current/time_series/HadCRUT.4.6.0.0.annual_ns_avg.txt', header = FALSE,select = c(1:2)) GTA1 <- as.matrix(dG1) saveRDS(GTA1,"GTA.rds") }, error = function(e) { message("GTA数据拉取失败,保留本地原有文件:", e$message) }) # MEI数据拉取与存储 tryCatch({ dM1 <- fread('https://psl.noaa.gov/data/correlation/mei.data',header = FALSE,fill = TRUE) dM2 <- dM1[complete.cases(replace(dM1, dM1 == -999.000, NA)),] dM3 <- matrix(as.numeric(unlist(dM2)),nrow=nrow(dM2)) dM4 <- data.frame(Year = rep(unique(dM3[,1]), each = 12),month = 1:12,value = as.vector(t(dM3[,2:13]))) MEI1 <- as.matrix(dMean(dM4)) saveRDS(MEI1,"MEI.rds") }, error = function(e) { message("MEI数据拉取失败,保留本地原有文件:", e$message) }) # SST数据拉取与存储 tryCatch({ dS1 <- fread('https://www.cpc.ncep.noaa.gov/data/indices/sstoi.indices',header = TRUE,select = c(1,2,10)) dS2 <- as.matrix(dS1) dS3 <- data.frame(Year = dS2[,1],month = dS2[,2], value = dS2[,3]) SST1 <- as.matrix(dMean(dS3)) saveRDS(SST1,"SST.rds") }, error = function(e) { message("SST数据拉取失败,保留本地原有文件:", e$message) })
月度自动调度配置
根据部署环境选择对应调度方案:
- Linux服务器:使用crontab配置,执行
crontab -e后添加如下规则(每月1日凌晨2点执行,替换为实际的Rscript路径和脚本路径即可):0 2 1 * * /usr/bin/Rscript /your/path/update_data.R >> /your/path/update_log.log 2>&1 - Windows服务器:使用系统自带的任务计划程序,新建任务设置触发器为每月1日触发,操作设置为启动Rscript程序,传入更新脚本的完整路径作为参数。
- macOS服务器:可使用launchd或crontab配置规则,同Linux配置逻辑。
Shiny应用侧修改
移除应用中原有的远程拉取数据逻辑,直接读取本地缓存的RDS文件即可:
# 应用启动时加载本地数据 GTA1 <- readRDS("GTA.rds") MEI1 <- readRDS("MEI.rds") SST1 <- readRDS("SST.rds")
优化后即使某个第三方站点临时维护,也只会跳过对应数据源的更新,应用始终可以读取到上一次成功拉取的有效数据,不会出现运行中断的问题。
内容的提问来源于stack exchange,提问作者Vishnupriya
相关产品推荐
相关产品推荐

