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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:31