2015-11-13 71 views
0

我有一個函數,它接受兩個參數,組裝一個URL並提交一個GET請求。我給函數提供了一個參數列表(每個記錄有一對參數),所有事情都恢復正常。如何在URL獲取請求之間暫停?

但是,我想確保我一次只發送一個請求。結果回來如此之快,以至於我不確定我是否在琢磨他們的服務器。

下面是我得到了什麼(DF是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

您從block函數返回後致電Sys.sleep。但是,我不確定它是否可以用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更新答案 –