使用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
相关产品推荐
相关产品推荐

