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

时间:2017-12-12 20:00:23

标签: r weather-api delayed-execution

我正在使用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函数执行以下操作:

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

    1. web_url是自定义网址,
    2. api_key是我的个人密钥,
    3. history_date是一个字符串(格式为"%d/%m/%Y %H:%M:%S")和
    4. data_format指定是否需要.XML或.json文件作为输出。
    5. 由于显而易见的原因,我无法分享网址/密钥。一旦我运行这个,我收到数据提供者的通知,我已超过每分钟允许的呼叫数(10)。我不是每次都收到通知 - 不知道为什么会这样。

      任何帮助表示赞赏!

1 个答案:

答案 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)
}

在这里,我们是

  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()

dat2<-bind_rows(dat)

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