You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:48:32