一部の API は、結果の代わりに API 呼び出しでトークンを返すため、そのトークンを使用して 2 番目の API 呼び出しを行い、クエリ結果を取得します。今のところ、関数内で Sys.sleep() を使用して、クエリが完了し、トークンが使用可能になるまでにかかる時間を推測しています。もっと良い方法があるに違いないようです。つまり、トークンを使用して 2 番目の API 呼び出しを X 秒ごと、または数秒ごとに、成功するまで繰り返し送信できますか?
以下は、TotalImpact API (http://total-impact.org/api-docs) を使用した最小限の例です。
require(RCurl); require(stringr); require(RJSONIO)
foo <- function(url, sleep) {
tt <- getURL(url)
token <- str_extract(tt[[1]], "[a-z0-9]+")
message("Pausing a bit for the query to finish...")
Sys.sleep(time = sleep)
fromJSON(
getURL(
paste("http://total-impact-core.herokuapp.com/item/", token, sep='')))
}
myurl <- "http://total-impact-core.herokuapp.com/tiid/doi/10.1371/journal.pcbi.1000361"
sleeptime <- 4
foo(myurl, sleeptime)
> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] C/en_US.UTF-8/C/C/C/C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] RJSONIO_0.98-1 stringr_0.6 RCurl_1.91-1 bitops_1.0-4.1 devtools_0.7
loaded via a namespace (and not attached):
[1] digest_0.5.2 httr_0.1.1 memoise_0.1 plyr_1.7.1 tools_2.15.1