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

如何在R循环中捕获dist_google的API无结果响应并自动处理

用tryCatch()自动化处理R中API调用的错误

这个问题太常见了——调用外部API时总会遇到各种不可控的错误,手动处理确实效率极低。tryCatch()正是R里用来处理这类“容错性执行”场景的工具,我来帮你修改代码实现自动化跳过错误并记录NA的需求。

核心思路

tryCatch()的作用是捕获代码执行中的错误,并执行我们预设的处理逻辑,而不是直接终止整个循环。对于你的场景,我们需要:

  1. 在循环中对每一对坐标的API调用包裹tryCatch()
  2. 当遇到错误时,返回一行和正常结果结构完全一致的NA记录
  3. 把正常结果或NA记录统一添加到最终数据框中

修改后的代码

首先,我先给你适配你的场景的完整代码,之后再拆解说明:

library(stplanr)

# 先运行一次成功的调用,确认dist_google返回的列名(示例列名仅供参考)
# success_test <- dist_google(from=fluxo[1,3:4], to=fluxo[1,5:6], mode='walking')
# colnames(success_test) # 用这个查看实际列名

# 初始化结果列表(比反复rbind更高效,尤其数据量大时)
result_list <- vector("list", nrow(fluxo))

for (linha in 1:nrow(fluxo)) {
  origin <- fluxo[linha, 3:4]
  destiny <- fluxo[linha, 5:6]
  
  # 用tryCatch包裹API调用
  current_result <- tryCatch(
    # 正常执行的代码:调用Google距离API
    expr = dist_google(from = origin, to = destiny, mode = 'walking'),
    # 捕获错误时执行的逻辑
    error = function(e) {
      # 打印错误信息,方便后续排查问题行(可选)
      message(paste("⚠️ 处理第", linha, "行时出错:", e$message))
      # 返回一行全NA的记录,列名必须和正常结果完全一致
      data.frame(
        distance = NA_real_,
        duration = NA_real_,
        from = NA_character_,
        to = NA_character_,
        mode = NA_character_,
        origin_address = NA_character_,
        destination_address = NA_character_,
        stringsAsFactors = FALSE
      )
    }
  )
  
  result_list[[linha]] <- current_result
}

# 把列表合并为最终数据框
tempos_falta_ubs <- do.call(rbind, result_list)

关键部分说明

  1. 提前确认列名:
    你需要先运行一次成功的dist_google()调用,用colnames()查看它返回的所有列名,然后在错误处理的data.frame()中把这些列都设置为NA——这样最终合并的数据框结构才会完全一致,不会出现列不匹配的问题。

  2. 用列表存储结果:
    比起循环里反复用rbind()拼接数据框,用列表存储每一行的结果最后再合并,效率会高很多(尤其是当你的数据集很大时)。

  3. 错误捕获与处理:

    • expr参数:放我们要执行的可能出错的代码(也就是调用dist_google())。
    • error参数:是一个函数,当expr中的代码抛出错误时会自动触发。我们在这里打印错误信息(方便调试),并返回结构一致的NA行。

效果

修改后的代码运行时,遇到API错误会自动打印错误提示,然后跳过该对坐标,在结果中添加一行NA,之后继续处理下一行——完全不需要手动干预,解放你的时间去做别的事。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:05:33