如何在R语言循环中传递emp.code列表并合并API返回的DataFrame
循环调用API并合并结果到同一DataFrame的解决方案
你的原始代码存在两个核心问题:
- 变量名冲突:原本存储
emp.Code的data变量,在循环里被重新赋值为API返回结果,直接覆盖了原始的员工代码列表 - 未保留历史结果:每次循环的结果都会覆盖前一次,最终只能得到最后一次API调用的结果
下面是修正后的实现方案,分两种方式:
方式一:基础循环实现
# 加载所需包 library(httr) library(jsonlite) library(dplyr) # 可选,用于更高效的行合并 # 初始化空的最终结果DataFrame final_df <- data.frame() # 遍历员工代码列表,用seq_along比1:length更安全(避免空列表出错) for(k in seq_along(data$emp.Code)) { # 拼接完整的API请求URL api_url <- paste0("https://urlpart1", data$emp.Code[[k]], "&StartDate=01-01-2023&EndDate=02-28-2023") # 发送GET请求 res <- GET(api_url) # 检查请求是否成功(HTTP状态码200代表成功) if(res$status_code == 200) { # 解析JSON响应并转为临时DataFrame temp_df <- as.data.frame(fromJSON(rawToChar(res$content))) # 将临时结果追加到最终DataFrame中 # 用dplyr::bind_rows更灵活,支持列名不完全匹配的情况;也可以用基础包的rbind final_df <- bind_rows(final_df, temp_df) } else { # 打印错误信息,避免单个请求失败导致整个循环中断 cat(paste("API调用失败,员工代码:", data$emp.Code[[k]], "状态码:", res$status_code, "\n")) } }
方式二:用purrr包简化代码(推荐)
如果习惯函数式编程,用purrr::map_dfr可以替代循环,代码更简洁易读:
library(httr) library(jsonlite) library(purrr) # 定义单个员工代码的API调用函数 fetch_emp_data <- function(emp_code) { api_url <- paste0("https://urlpart1", emp_code, "&StartDate=01-01-2023&EndDate=02-28-2023") res <- GET(api_url) if(res$status_code == 200) { return(as.data.frame(fromJSON(rawToChar(res$content)))) } else { # 抛出警告并返回空DataFrame,不影响整体合并 warning(paste("API调用失败,员工代码:", emp_code, "状态码:", res$status_code)) return(data.frame()) } } # 批量处理所有员工代码并自动合并结果 final_df <- map_dfr(data$emp.Code, fetch_emp_data)
关键注意点
- 变量名区分:始终用不同的变量存储原始数据、临时结果和最终结果,避免覆盖
- 错误处理:加入状态码检查,防止单个API请求失败导致整个流程中断
- 循环安全性:用
seq_along替代1:length(),当员工代码列表为空时不会出错
内容的提问来源于stack exchange,提问作者SNT
相关产品推荐
相关产品推荐

