2017-05-22 11 views
1

Googleトレンドからデータをダウンロードしています。時には接続がなくなり、最初からループを再起動する必要があります(1-726)。 721回目の試行でエラーが発生したとします。もう一度1から再起動する必要があります。JsonliteとForループの問題

library(jsonlite) 
baseurl <- "https://www.googleapis.com/trends/v1beta/graph?&terms=" 
for(i in 1:726){ 
mydata <- fromJSON(paste0(baseurl, file.list$query[i]), flatten=TRUE) 
message("Retrieving query ", i) 
pages[[i]] <- mydata$lines 
} 

エラーは、その後、私は必要なデータを取得するために、繰り返しプロセス全体を再起動する必要があり、この

Retrieving query 1 
Retrieving query 2 
Retrieving query 3 
Error in open.connection(con, "rb") : HTTP error 503. 

をlooklikes。進歩を失うことなくそれ自体を再試行する方法がありますか?

+0

私は無料のGoogle APIは、秒あたりのリクエスト数にいくつかの制限があるかもしれないと思う...ループ内に 'Sys.sleep(0.5)'を追加して、毎秒2リクエストを実行してみてください... – digEmAll

+0

または読み込みを 'try'節で囲み、成功をベクトルに格納することができます。次に、どのリクエストが成功したかを知ることができます – ekstroem

答えて

0

Thisの回答は、エラー/例外が発生した場合に反復を再試行するのに役立つスニペットを説明しています。このようスニペットを使ってあなたのコードでは、(あなたがfile.listには何も割り当てなかったとして、それは、ところで再現することは不可能です)、次のようになります。

library(jsonlite) 
baseurl <- "https://www.googleapis.com/trends/v1beta/graph?&terms=" 
for(i in 1:726){ 
    mydata<-NULL 
    attempt <- 1 
    while(is.null(mydata) && attempt <= 3) { 
    attempt <- attempt + 1 
    try(
     mydata <- fromJSON(paste0(baseurl, file.list$query[i]), flatten=TRUE) 
    ) 
    } 
    message("Retrieving query ", i) 
    pages[[i]] <- mydata$lines 
} 

while状態での試行回数を変更する自由を感じます。また、理由は1秒あたりの要求数の制限になる可能性があります - digEmAllが示唆しているように、Sys.sleep()を追加してみてください。

関連する問題