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

如何用tidyverse逐行将多列传入非向量化函数(含API调用)

在tidyverse中逐行处理tibble并调用非向量化API的方案

针对你的需求(逐行传递tibble的两列值调用非向量化API,存入返回的列表,且支持调用延迟),tidyverse中最适合的工具是purrr包的映射函数,尤其是pmap()(多参数场景),也可以用rowwise()配合mutate()实现。以下是具体实现方式:

1. 核心方案:使用purrr::pmap()

pmap()专门用于处理多参数的逐行映射,能自然接收tibble的多列作为函数参数,同时方便加入延迟逻辑。

步骤示例

首先定义模拟API调用的函数(模拟非向量化、返回列表、带延迟的特性):

# 模拟非向量化API:接收a、b两个参数,返回列表,调用间隔0.5秒
call_api <- function(a_val, b_val) {
  Sys.sleep(0.5) # 模拟API调用延迟
  # 返回复杂列表结果
  list(
    combined_str = paste0(a_val, b_val),
    str_length = nchar(paste0(a_val, b_val)),
    input_pair = c(a_val, b_val)
  )
}

然后用pmap()逐行处理你的tibble:

library(tidyverse)

# 示例数据
d <- tibble(a=c("a", "b", "d"), b=c("x", "y", "z"))

# 逐行调用API,将结果存入新列
d_with_response <- d %>%
  mutate(api_result = pmap(list(a, b), call_api))

# 查看结果:api_result是列表类型的列
d_with_response

如果需要展开列表列的内容,使用unnest_wider()将列表的每个元素拆分为单独列:

d_expanded <- d_with_response %>%
  unnest_wider(api_result)

d_expanded

2. 替代方案:rowwise() + mutate()

如果更偏好直观的逐行写法,可以用rowwise()将tibble按行分组,再结合mutate()调用函数:

d_rowwise <- d %>%
  rowwise() %>%
  mutate(api_result = call_api(a, b)) %>%
  ungroup() # 必须取消分组,避免后续操作继承行分组状态

# 展开结果
d_rowwise %>%
  unnest_wider(api_result)

3. 进阶:添加错误处理

如果API调用可能失败,用purrr::safely()包裹API函数,避免整个流程中断,同时捕获错误信息:

# 包装API函数,返回包含结果和错误的列表
safe_api_call <- safely(call_api)

d_safe <- d %>%
  mutate(api_response = pmap(list(a, b), safe_api_call)) %>%
  # 拆分结果和错误信息
  mutate(
    result = map(api_response, "result"),
    error = map(api_response, "error")
  ) %>%
  select(-api_response)

# 查看结果和错误
d_safe

方案对比

  • pmap():函数式风格,性能更优(尤其数据量大时),适合批量多参数映射。
  • rowwise():写法更直观,但行分组会带来额外性能开销,适合小数据集或快速原型开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:59:55