我使用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是一个定制的url,api_key是我的私钥,history_date是一个字符串(格式化为"%d/%m/%Y %H:%M:%S"),并且data_format指定是否希望.XML或.json文件作为输出。由于明显的原因,我不能分享网址/密钥。一旦我运行这个程序,我就会从数据提供者那里得到一个通知,说我已经超过了每分钟(10)允许的调用。我不是每次都收到通知--也不知道为什么。
任何帮助都是非常感谢的!
发布于 2020-04-03 21:20:26
如果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?
https://stackoverflow.com/questions/47780628
复制相似问题