R语言snotelr包批量下载Snotel站点数据报行数不一致错误
报错原因
报错本质是部分SNOTEL站点无有效观测数据触发了包内部的逻辑bug:snotel_download()运行时会自动将单站点元数据(固定1行结构)和拉取到的观测表合并为一个数据框,当遍历到已停用、无公开观测记录的站点时,拉取到的观测表是0行,和1行的元数据拼接就会抛出你看到的行数不匹配错误。前2个站点测试能正常运行,只是刚好这两个站点属于有完整数据的正常站点,全量遍历时碰到空站点就会直接中断。
修复方案
在遍历逻辑里增加错误捕获和空结果过滤即可,既可以跳过无数据的故障站点,也能避免网络波动导致单站下载失败时,之前已经下载的所有数据全部丢失,修改后代码如下:
library(snotelr) library(dplyr) SnowMetaData <- snotel_info() # 先逐站下载,自动跳过异常站点 SnowData_list <- lapply(SnowMetaData$site_id, function(thisSite){ cat("处理站点ID:", thisSite, "\n") # 捕获单站下载报错 site_res <- tryCatch({ snotel_download(site_id = thisSite, internal = TRUE) }, error = function(e){ cat("站点", thisSite, "下载异常,已跳过\n") return(NULL) }) # 过滤空结果 if (is.null(site_res) || nrow(site_res) < 1) { return(NULL) } return(site_res) }) # 移除空结果后合并为总表 SnowData <- bind_rows(SnowData_list[!sapply(SnowData_list, is.null)])
补充说明
- 上述代码没有依赖额外第三方包,用base R的逻辑做空值过滤,不需要额外装包就能跑
- 如果需要统计哪些站点下载失败,可以在捕获错误的分支里把异常站点ID存入单独的向量,循环结束后导出核对即可
- 全量站点数据量较大,若需要断点续传,可以在循环里加个判断:如果本地已经存过该站点的rds文件就直接读本地,没有的话再走下载逻辑,能节省大量重复下载的时间
内容的提问来源于stack exchange,提问作者elissafromfallacy
相关产品推荐
相关产品推荐

