#RStats — API calls et Sys.sleep

1 minute(s) read

J’ai récemment reçu un mail concernant mon post sur l’API Discogs, disant que le code ne fonctionnait pas.

Il s’est avéré que cela était dû aux nouvelles limitations de l’API. Voici comment contourner ces limites avec R.

Requête Discogs

Voici le billet de blog décrivant comment faire des requêtes sur l’API Discogs avec R.

Il y a quelques semaines, j’ai reçu un mail indiquant que la deuxième partie du code ne fonctionnait pas, renvoyant seulement des NA. Il s’est avéré que cela était dû aux changements récents de l’API Discogs, limitant le nombre de requêtes possibles dans une période spécifique.

Récemment également, j’ai utilisé l’API Computer Vision de Microsoft - une API limitant les requêtes à 20 par minute - pour un blogpost sur Data Bzh.

Alors, comment automatiser le requêtage sur une API quand elle limite le nombre de requêtes par minutes / heure / jour (par exemple, si vous avez 282 images à analyser) ?

Première méthode : for loop et Sys.sleep()

Remarque : ce blogpost ne contient aucune requête API, j’utiliserais Sys.time () pour montrer comment fonctionne Sys.sleep ().

Si vous souhaitez limiter à 20 appels par minute, vous devrez utiliser Sys.sleep (). Cette fonction ne prend qu’un argument, time, qui est le nombre de secondes que vous souhaitez arrêter R avant de reprendre.

Par exemple, dans un for loop, vous pouvez faire une pause de 10 secondes à chaque itération de la boucle :

for(i in 1:3){
  print(Sys.time())
  Sys.sleep(time = 10)
}
## [1] "2017-03-26 11:13:58 CET"
## [1] "2017-03-26 11:14:08 CET"
## [1] "2017-03-26 11:14:18 CET"

Avec un lapply

Si vous avez accès au cœur de la fonction que vous souhaitez utiliser (par exemple la fonction requêtant l’API), vous pouvez utiliser un lapply, et insérer Sys.sleep () dans cette fonction.

C’est cette méthode que vous devrez utiliser dans le code pour Discogs, et que j’ai utiliser dans le billet sur Computer Vision.

library(tidyverse)
lapply(1:3, function(x) {
  print(x)
  print(Sys.time()) 
  Sys.sleep(3)
}) %>% do.call(rbind, .) 
## [1] 1
## [1] "2017-03-26 11:20:22 CET"
## [1] 2
## [1] "2017-03-26 11:20:25 CET"
## [1] 3
## [1] "2017-03-26 11:20:28 CET"

Hope this can help!

What do you think?