-
Notifications
You must be signed in to change notification settings - Fork 11
/
sirets_successeurs.R
88 lines (76 loc) · 2.58 KB
/
sirets_successeurs.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#' Liens de succession d'une liste d'établissements
#'
#' Télécharge sur l'API Sirene l'ensemble des successeurs d'une liste
#' d'établissements.
#'
#' Cette fonction appelle [`telechargerDonnees`] pour chacun des établissements
#' passés en paramètre (de manière optimisée).
#'
#' Les données téléchargées au format "json" sont enregistrées dans un dossier
#' temporaire.
#'
#' @section Authentification API Sirene:
#' Comme toutes les fonctions reposant sur l'[API](https://api.insee.fr) Sirene,
#' cette fonction nécessite une clé d'application et un secret associé pour
#' pouvoir générer un jeton d'accès. Ces informations sont à passer sous forme
#' de variables d'environnement.
#'
#' Renseigner pour cela `INSEE_APP_KEY` et `INSEE_APP_SECRET` dans un fichier
#' de configuration `.Renviron`.
#' Consulter [cette page](https://api.insee.fr/catalogue/site/themes/wso2/subthemes/insee/pages/help.jag)
#' pour de l'aide sur comment obtenir de tels identifiants.
#'
#' @param sirets établissements pour lesquels rechercher les successeurs (un
#' vecteur caractère de numéros SIRET).
#' @param ... paramètres additionnels de la fonction `telechargerDonnees`
#'
#' @return Un data.frame agrégeant les résultats pour chaque siret (vide si
#' aucun des établissements n'a de successeur).
#'
#' @export
#'
#' @examples \dontrun{
#'
#' sirets_successeurs(c("30070230500040", "30137492200120", "30082187300019"))
#' }
sirets_successeurs <- function(sirets, ...) {
stopifnot(
is.character(sirets),
length(sirets) > 0
)
sirets <- unique(sirets)
# si l'url de la requete est trop longue (plus de 3400 caracteres, limite
# max estimee empiriquement), une erreur survient
# -> on fait des groupes de 68 sirets
grp_sirets <- split(sirets, (seq_along(sirets) - 1) %/% 68)
sortie_tot <- lapply(unname(grp_sirets), sucesseurs_quiet, ...)
# agrege
sortie_tot <- do.call(rbind, sortie_tot)
unique(sortie_tot)
}
# Fonction auxiliaire
sucesseurs_quiet <- function(sirets, ...) {
# telecharge successeurs avec gestion des requêtes sans résultat
# construit requete
query <-
paste(
paste("siretEtablissementPredecesseur", sirets, sep = ":"),
collapse = " OR "
)
# appel API via doremifasol (si 404 -> data.frame vide)
dl <- telechargerFichier(
"SIRENE_SIRET_LIENS",
argsApi = list(q = query, tri = "successeur"),
...
)
tab <- tryCatch(
chargerDonnees(dl),
error = function(e) {
if (grepl("Erreur 404", e$message))
return(data.frame())
else {
return(NULL)
}
}
)
}