К вашему сведению, основываясь на некоторых комментариях, я добавил дополнительную информацию.
Я создал следующую функцию, которая выполняет вызов 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 (более 120 000 вызовов).К сожалению, случается, что есть некоторые 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 не дает ответа, а затем подождать, пока оно не получит его?»
Надеюсь, это будет понятнее.