我正在使用R对天气数据提供商进行API调用以下载一些天气预报。我正在使用一个免费密钥,每分钟拨打不超过10个电话。我尝试使用Sys.sleep()
来确保我没有超过阈值,但API资源监视器告诉我,我已经超过了调用次数。
例如,如果我正在进行6次呼叫,则呼叫之间的10秒时间间隔应该足够(不考虑R所需的时间)。
dat <- list()
for(i in 1:6){
dat[[i]] <- getWeatherData(web_url, api_key, history_date, data_format)
Sys.sleep(10)
web_url <- gsub(i-1, i, url)
}
getWeatherData
函数执行以下操作:
httr::GET()
获取数据),POSIXct
)和lubridate::round_date()
)。功能输入:
web_url
是自定义网址,api_key
是我的个人密钥,history_date
是一个字符串(格式为"%d/%m/%Y %H:%M:%S"
)和data_format
指定是否需要.XML或.json文件作为输出。 由于显而易见的原因,我无法分享网址/密钥。一旦我运行这个,我收到数据提供者的通知,我已超过每分钟允许的呼叫数(10)。我不是每次都收到通知 - 不知道为什么会这样。
任何帮助表示赞赏!
答案 0 :(得分:0)
如果Sys.sleep无法解决问题,则此解决方案将对您有所帮助。
基本上,这用Sys.sleep
逻辑代替了while
的使用。
dat <- list()
delay_seconds<-10
for(i in 1:6){
dat[[i]] <- getWeatherData(web_url, api_key, history_date, data_format)
date_time<-Sys.time()
while((as.numeric(Sys.time()) - as.numeric(date_time))<delay_seconds){}
web_url <- gsub(i-1, i, url)
}
在这里,我们是
delay_seconds<-10
)date_time<-Sys.time()
)while
循环检查与我们的比较时间相比的当前时间,并查看它是否小于我们选择的延迟间隔((as.numeric(Sys.time()) - as.numeric(date_time)<delay_seconds
){}
)不知道是否需要/想要,但是如果希望将数据从列表中取出并以更长的组合形式使用,我建议使用dplyr
函数bind_rows()
dat2<-bind_rows(dat)
感谢rbtj对以下问题的回答:How to make execution pause, sleep, wait for X seconds in R?