2015-11-13 2 views
0

У меня есть функция, которая принимает два аргумента, собирает URL-адрес и отправляет запрос GET. Я передаю функции список аргументов (пара аргументов для каждой записи), и все возвращается очень хорошо.Как мне сделать паузу между запросами URL Get?

Однако, я хотел бы быть уверенным, что я отправляю только один запрос за раз. Результат возвращается так быстро, что я не уверен, что я забиваю их сервер или нет.

Вот что у меня есть (ДФ является dataframe с 25 строками, поэтому я представление 25 запросов, в данном случае):

library(RCurl) 

block <- function(latty, longy){ 
      url <- paste0("http://data.fcc.gov/api/block/2010/find?latitude=", latty, "&longitude=", longy) 
      response <- getURL(url) 
      blockID <- substr(sub(".*Block FIPS=\\\"","",response), 0, 15) 
      return(blockID) 
      Sys.sleep(0.25) 
      } 

result <- do.call(block, list(latty=df$lat, longy=df$long)) 

Когда я запускаю этот скрипт, является его флудерами сервера с запросов, или он проходит через них по скорости Sys.sleep?

ответ

2

Вы звоните Sys.sleep после возврата из функции block. Однако я не уверен, что он может быть разрешен с помощью do.call, так как он передает все аргументы в один раз. Вместо этого я использовал бы sapply или другую векторизованную функцию. Например

sapply(1:nrow(df$long), block) 
block <- function(i){ 
       latty <- df$lat[i] 
       longy <- df$long[i] 
       Sys.sleep(0.25) 
       url <- paste0("http://data.fcc.gov/api/block/2010/find?latitude=", latty, "&longitude=", longy) 
       response <- getURL(url) 
       substr(sub(".*Block FIPS=\\\"","",response), 0, 15) 
       } 

sapply будет ждать каждой итерации, чтобы закончить, прежде чем начать еще один, например

> sapply(1:10, function(x) {Sys.sleep(1); print(Sys.time())}) 
[1] "2015-11-13 11:36:28 PST" 
[1] "2015-11-13 11:36:29 PST" 
[1] "2015-11-13 11:36:30 PST" 
[1] "2015-11-13 11:36:31 PST" 
[1] "2015-11-13 11:36:32 PST" 
[1] "2015-11-13 11:36:33 PST" 
[1] "2015-11-13 11:36:34 PST" 
[1] "2015-11-13 11:36:35 PST" 
[1] "2015-11-13 11:36:36 PST" 
[1] "2015-11-13 11:36:37 PST" 
+0

Спасибо! Является ли вызов моей функции (do.call) подачей одной пары аргументов за раз? То есть, он представляет пару, дожидается ответа и затем отправляет следующую пару? – Phoebe

+0

@ user1252489 Возможно, вы должны использовать 'mapply' вместо этого? –

+0

@ user1252489 обновите ответ –

Смежные вопросы