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

使用R调用CKAN API批量下载资源仅获首个文件的问题排查

问题分析与解决方法

核心错误

你的for循环缺少大括号{},R语言中若for语句后未用大括号包裹代码块,只会将紧跟的第一行代码纳入循环范围。这导致:

  • 循环仅遍历所有ID并反复更新a的值,但后续获取下载链接、生成保存路径、执行下载的代码只会在循环结束后运行一次,自然无法完成所有文件的下载。

修正后的基础代码

只需给循环体加上大括号,确保所有需要重复执行的操作都在循环内:

id_download <- function(id) {
  for (i in id) {
    a <- resource_show(i)
    b <- a$url
    destfile <- paste("C:/Users/Name/Documents/Database_updates/OSM_benthic_invertebrates/", basename(b))
    curl::curl_download(b, destfile)
  }
}

额外优化建议(可选)

为让脚本更健壮易用,可添加以下功能:

  • 自动创建保存目录(避免目录不存在导致下载失败)
  • 仅下载Excel格式文件(过滤非目标资源)
  • 错误捕获(单个资源出错不会中断整个循环)
  • 进度日志(方便跟踪下载状态)

优化后的代码示例:

id_download <- function(id, save_dir = "C:/Users/Name/Documents/Database_updates/OSM_benthic_invertebrates/") {
  # 自动创建保存目录(递归创建父目录)
  if (!dir.exists(save_dir)) {
    dir.create(save_dir, recursive = TRUE)
    cat("已创建保存目录:", save_dir, "\n")
  }
  
  for (i in id) {
    tryCatch({
      cat("正在处理资源ID:", i, "\n")
      resource <- resource_show(i)
      file_url <- resource$url
      
      # 仅处理Excel文件(匹配.xls或.xlsx后缀,忽略大小写)
      if (grepl("\\.xlsx?$", file_url, ignore.case = TRUE)) {
        dest_path <- file.path(save_dir, basename(file_url))
        curl::curl_download(file_url, dest_path)
        cat("✅ 已下载:", dest_path, "\n")
      } else {
        cat("⚠️ 跳过非Excel文件:", file_url, "\n")
      }
    }, error = function(e) {
      cat("❌ 处理资源ID", i, "时出错:", e$message, "\n")
    })
  }
}

内容的提问来源于stack exchange,提问作者Nic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:30:28