如何在R循环中捕获dist_google的API无结果响应并自动处理
用
tryCatch()自动化处理R中API调用的错误 这个问题太常见了——调用外部API时总会遇到各种不可控的错误,手动处理确实效率极低。tryCatch()正是R里用来处理这类“容错性执行”场景的工具,我来帮你修改代码实现自动化跳过错误并记录NA的需求。
核心思路
tryCatch()的作用是捕获代码执行中的错误,并执行我们预设的处理逻辑,而不是直接终止整个循环。对于你的场景,我们需要:
- 在循环中对每一对坐标的API调用包裹
tryCatch() - 当遇到错误时,返回一行和正常结果结构完全一致的NA记录
- 把正常结果或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)
关键部分说明
提前确认列名:
你需要先运行一次成功的dist_google()调用,用colnames()查看它返回的所有列名,然后在错误处理的data.frame()中把这些列都设置为NA——这样最终合并的数据框结构才会完全一致,不会出现列不匹配的问题。用列表存储结果:
比起循环里反复用rbind()拼接数据框,用列表存储每一行的结果最后再合并,效率会高很多(尤其是当你的数据集很大时)。错误捕获与处理:
expr参数:放我们要执行的可能出错的代码(也就是调用dist_google())。error参数:是一个函数,当expr中的代码抛出错误时会自动触发。我们在这里打印错误信息(方便调试),并返回结构一致的NA行。
效果
修改后的代码运行时,遇到API错误会自动打印错误提示,然后跳过该对坐标,在结果中添加一行NA,之后继续处理下一行——完全不需要手动干预,解放你的时间去做别的事。
内容的提问来源于stack exchange,提问作者Bruno Pinheiro
相关产品推荐
相关产品推荐

