【问题标题】:How to handle API error in a foreach loop R?如何处理 foreach 循环 R 中的 API 错误?
【发布时间】:2019-08-06 11:09:07
【问题描述】:

仅供参考,我根据一些 cmets 添加了更多信息。

我创建了以下调用 API 的函数:

keyword_checker <- function(keyword, domain, loc, lang){

  keyword_to_check <- as.character(keyword)

  api_request <- paste("https://script.google.com/blabalbalba",
                       "?kw=",keyword,
                       "&domain=",domain,
                       "&loc=",loc,
                       "&lang=",lang,sep="")
  api_request <- URLencode(api_request, repeated = TRUE)  
  source <-fromJSON(file = api_request)#Json file into Data Frame
  return(data.frame(do.call("rbind", source$data$result))) ##in order to extract only the "results" data

我正在使用 R 包 foreach()%dopar%doSNOW 来执行许多 API 调用(超过 120k 调用)。 不幸的是,碰巧有一些errors(通常是超时连接),所以它使脚本停止。为了避免这个问题,我使用了.errorhandling = 'pass'。现在,脚本并没有停止,但我想知道是否有办法在我得到答案之前进行 API 调用?

这是我的脚本:

cl <- makeCluster(9)
registerDoSNOW(cl)

final_urls_checker <- foreach(i = 1:length(mes_urls_to_check), .combine=rbind, .errorhandling = 'pass', .packages='rjson') %dopar% {
  test_keyword <- as.character(mes_urls_to_check[i])
  results <- indexed_url(test_keyword)}  ##name of my function

##Stop cluster
stopCluster(cl)

我基本上希望我的脚本继续运行(不停止整个过程),直到我从 API 调用中得到答案

我是否需要将TryCatch 函数合并到foreach 中,或者通过添加类似“如果API 没有给出答案,然后等到明白了吗?”

我希望这更清楚。

【问题讨论】:

  • 可能是通过在foreach 循环内添加try catch 块?

标签: r foreach error-handling parallel-processing


【解决方案1】:

尝试在foreach 函数中使用tryCatch 来捕获预期的错误消息(此处由于超时导致API 调用失败)。根据我的理解,下面是给定函数keyword_checker的示例代码sn-p。

library(foreach)
 cl <- makeCluster(9)
registerDoSNOW(cl)

final_urls_checker <- foreach(i = 1:length(mes_urls_to_check), .combine=rbind, .errorhandling = 'pass', 
    .packages='rjson') %dopar% {
  test_keyword <- as.character(mes_urls_to_check[i])
  #results <- keyword_checker(test_keyword)}  ##name of my function
  results <- function(test_keyword){
    dmy <- tryCatch(
    {
        keyword_checker(test_keyword)
    },
    error = function(cond){
        message = "Timeout error! Calling again..."
        dmy2 <- keyword_checker(test_keyword)
        return(dmy2) 
    }
    warning = function(cond){
        message("Warning message:")
        message(cond)
        return(NULL)
    }
    finally = {
        message(paste("Succesfully called API ", test_keyword))
    }
        )
    return(dmy)
  }

##Stop cluster
stopCluster(cl)

这是一个link,它解释了如何编写tryCatch。请注意,这个 sn-p 可能不完全有效,因为我没有运行代码块。但是再次调用 API 调用者,当它失败时应该可以完成这项工作。

查看此link,了解类似问题的讨论。

【讨论】:

  • 感谢您的帮助。我试图提供有关我的问题的更多信息。希望这会更容易理解
  • 感谢您的回答,我会尽快尝试。我也会更新我的答案,因为我直接在我创建的函数中尝试了trycatch,这也有效
【解决方案2】:

这是一个更新的脚本,包括直接在函数中的TryCatch

indexed_url <- function(url){

  url_to_check <- as.character(url)

  api_request <- paste("https://script.google.com/macros/blablabalbalbaexec",
                       "?page=",url_to_check,sep="")
  api_request <- URLencode(api_request, repeated = TRUE)  
  source <- tryCatch({
    fromJSON(file = api_request)#Convertir un Json file en Data Frame  
  }, error = function(e) {
    cat(paste0("Une erreur a eu lieu :",e))
    Sys.sleep(1)
    indexed_url(url)
  })  
  return(data.frame(do.call("rbind", source)))
}

然后运行 ​​foreach 就像它完美运行的方式一样。没有更多的错误,我有完整的分析。

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 2015-06-24
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多