首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Sys.sleep()延迟API调用

使用Sys.sleep()延迟API调用
EN

Stack Overflow用户
提问于 2017-12-12 20:00:22
回答 1查看 2.2K关注 0票数 1

我使用R对天气数据提供程序进行API调用,以下载一些天气预报。我使用的是一个免费的钥匙,允许我每分钟打10个电话。我尝试使用Sys.sleep()来确保我不会超过阈值,但是API资源监视器告诉我我已经超过了调用的次数。

例如,如果我打了6个电话,调用之间的时间间隔应该是10秒(不考虑R所需的时间)。

代码语言:javascript
复制
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函数执行以下操作:

  1. 进行API调用(每次调用函数时只执行一个API调用)。使用httr::GET()获取数据),
  2. 解析XML输出以获得所需的变量(正则表达式),
  3. 执行一些清理(对于丢失的/垃圾值),
  4. 将字符串转换为R日期时间对象(POSIXct),以及
  5. 值到最近的时间(lubridate::round_date())。

功能投入:

  1. web_url是一个定制的url,
  2. api_key是我的私钥,
  3. history_date是一个字符串(格式化为"%d/%m/%Y %H:%M:%S"),并且
  4. data_format指定是否希望.XML或.json文件作为输出。

由于明显的原因,我不能分享网址/密钥。一旦我运行这个程序,我就会从数据提供者那里得到一个通知,说我已经超过了每分钟(10)允许的调用。我不是每次都收到通知--也不知道为什么。

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2020-04-03 21:20:26

如果Sys.sleep没有做到这一点,这个解决方案应该对您有帮助。

基本上,这将Sys.sleep的使用替换为while逻辑。

代码语言:javascript
复制
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)
}

在这里,我们是:

  1. 定义等待的秒数( delay_seconds<-10 )
  2. 定义比较的开始时间( date_time<-Sys.time() )
  3. 使用while循环,与比较时间比较检查当前时间,并查看此时间是否小于选定的延迟间隔( (as.numeric(Sys.time()) - as.numeric(date_time)<delay_seconds )。
  4. 在等待时间结束之前什么也不做( {} )

不知道是否需要/希望这样做,但如果您希望将数据从列表中提取出来,并以更长的组合形式出现,我建议使用dplyr函数bind_rows()

代码语言:javascript
复制
dat2<-bind_rows(dat)

感谢rbtj对这个问题的回答:How to make execution pause, sleep, wait for X seconds in R?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47780628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档