Passer au contenu

DSIR est un petit package R pour les travaux sur les données de santé mondiale. Il fournit les métadonnées des États Membres de l’OMS, des clients légers pour les API GHO et ODD des Nations Unies, ainsi que des thèmes ggplot2 et une mise en forme flextable réutilisables, dans le style de l’OMS. Il s’adresse aux professionnels de santé, au personnel de l’OMS et aux chercheurs qui répètent régulièrement les mêmes tâches.

Ce tutoriel présente le parcours habituel : rechercher des pays, obtenir les données du GHO et des ODD, nettoyer les réponses et produire des graphiques et des tableaux pour les rapports. Un tutoriel distinct décrit WHO xMart et les GHE.

Installation et préparation

Dans R, installez le package depuis CRAN :

Ce tutoriel utilise aussi dplyr et ggplot2. Si nécessaire, installez-les avec install.packages(c("dplyr", "ggplot2")).

library(DSIR)
library(dplyr)
#> 
#> Attachement du package : 'dplyr'
#> Les objets suivants sont masqués depuis 'package:stats':
#> 
#>     filter, lag
#> Les objets suivants sont masqués depuis 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)

Le code, les noms de fonctions et de colonnes, ainsi que les libellés des graphiques sont communs à la version anglaise. La langue du site ne modifie pas les libellés renvoyés par les sources. Les objectifs de développement durable sont abrégés en ODD dans le texte et en SDG dans le code.

Métadonnées des États Membres de l’OMS

La table who_countries contient les 194 États Membres de l’OMS, avec leurs codes ISO3, ISO2 et M49, leurs noms officiels et courts et leur région OMS. La colonne is_pic identifie les 14 pays insulaires du Pacifique au sein de la Région du Pacifique occidental.

who_countries
#> # A tibble: 194 × 8
#>    iso3  iso2  m49_code name_official       name_short         who_region is_pic
#>    <chr> <chr> <chr>    <chr>               <chr>              <chr>      <lgl> 
#>  1 AFG   AF    004      Afghanistan         Afghanistan        EMR        FALSE 
#>  2 ALB   AL    008      Albania             Albania            EUR        FALSE 
#>  3 DZA   DZ    012      Algeria             Algeria            AFR        FALSE 
#>  4 AND   AD    020      Andorra             Andorra            EUR        FALSE 
#>  5 AGO   AO    024      Angola              Angola             AFR        FALSE 
#>  6 ATG   AG    028      Antigua and Barbuda Antigua and Barbu… AMR        FALSE 
#>  7 ARG   AR    032      Argentina           Argentina          AMR        FALSE 
#>  8 ARM   AM    051      Armenia             Armenia            EUR        FALSE 
#>  9 AUS   AU    036      Australia           Australia          WPR        FALSE 
#> 10 AUT   AT    040      Austria             Austria            EUR        FALSE 
#> # ℹ 184 more rows
#> # ℹ 1 more variable: wb_income_group <chr>

DSIR fournit aussi des vecteurs prédéfinis de codes ISO3 pour chaque région OMS.

wpro_cty
#>  [1] "AUS" "BRN" "CHN" "COK" "FJI" "FSM" "IDN" "JPN" "KHM" "KIR" "KOR" "LAO"
#> [13] "MHL" "MNG" "MYS" "NIU" "NRU" "NZL" "PHL" "PLW" "PNG" "SGP" "SLB" "TON"
#> [25] "TUV" "VNM" "VUT" "WSM"
length(wpro_cty)   # 28 Member States in WPR (since May 2025)
#> [1] 28

L’indicateur is_pic facilite l’analyse collective des pays insulaires du Pacifique, dont les caractéristiques démographiques et géographiques sont particulières.

who_countries |>
  filter(is_pic) |>
  select(iso3, name_short)
#> # A tibble: 14 × 2
#>    iso3  name_short      
#>    <chr> <chr>           
#>  1 COK   Cook Islands    
#>  2 FJI   Fiji            
#>  3 KIR   Kiribati        
#>  4 MHL   Marshall Islands
#>  5 FSM   Micronesia      
#>  6 NRU   Nauru           
#>  7 NIU   Niue            
#>  8 PLW   Palau           
#>  9 PNG   Papua New Guinea
#> 10 WSM   Samoa           
#> 11 SLB   Solomon Islands 
#> 12 TON   Tonga           
#> 13 TUV   Tuvalu          
#> 14 VUT   Vanuatu

iso3_to_region() associe un vecteur de codes ISO3 aux régions OMS. La fonction est vectorisée et renvoie NA pour les codes qui ne correspondent pas à un État Membre.

iso3_to_region(c("PHL", "FRA", "ZAF", "USA", "XYZ"))
#> [1] "WPR" "EUR" "AFR" "AMR" NA
# "WPR" "EUR" "AFR" "AMR" NA

Cette fonction facilite la jointure entre des données externes identifiées par ISO3 et la structure régionale de l’OMS.

iso3_to_m49() convertit les codes ISO3 en codes numériques M49 des Nations Unies. Par exemple, le GHO utilise "PHL", tandis que l’API ODD utilise "608". Les résultats sont des chaînes de trois caractères, complétées par des zéros à gauche, comme dans who_countries$m49_code.

iso3_to_m49(c("PHL", "FRA", "JPN"))
#> [1] "608" "250" "392"
# "608" "250" "392"

# Case-insensitive; non-Member areas return NA
iso3_to_m49(c("phl", "PRI"))
#> [1] "608" NA
# "608" NA

En pratique, la conversion explicite est souvent inutile : sdg_data() et sdg_coverage() acceptent des codes ISO3 dans area et effectuent la conversion en interne.

Lors de la construction du site et du package, les exemples nécessitant le réseau et les graphiques associés sont affichés sans exécution. Pour les exécuter pendant le rendu, définissez DSIR_BUILD_LIVE_VIGNETTE=true dans la session de rendu.

Vérifier la disponibilité avant le téléchargement

Le répertoire public du GHO contient de nombreux indicateurs, mais un indicateur donné ne couvre pas forcément les pays ou les années souhaités. Avant un téléchargement complet avec gho_data(), trois fonctions permettent d’interroger la disponibilité sans télécharger toutes les observations.

gho_has_data() vérifie si des données existent pour un indicateur et des filtres donnés. Elle est utile pour examiner une liste d’indicateurs candidats.

# Does WHO have life-expectancy data for France?
gho_has_data("WHOSIS_000001", area = "FRA")
# TRUE

# Bulk-screen several indicators at once
inds <- c("WHOSIS_000001", "NCDMORT3070", "MDG_0000000026")
vapply(inds, gho_has_data, logical(1), area = "PHL")

Elle renvoie TRUE, FALSE ou NA. Les échecs de requête, y compris un code absent du répertoire public actuel, produisent NA.

gho_count() renvoie le nombre de lignes correspondant aux mêmes filtres, ce qui aide à estimer la taille du téléchargement.

gho_count("WHOSIS_000001", area = wpro_cty)

gho_coverage() résume les années couvertes et le nombre d’observations par pays. Elle ne demande que SpatialDim et TimeDim, ce qui réduit le volume transféré.

gho_coverage("WHOSIS_000001", area = c("FRA", "DEU", "JPN"))

Consulter les dates de mise à jour des sources

La fonction expérimentale gho_last_updated() recherche l’horodatage non manquant le plus récent parmi les observations actuelles d’un indicateur, pour tous les lieux, années et dimensions. Un argument backend explicite prime sur DSIR.who_backend. Si aucun des deux n’est défini, la fonction utilise auto. Ce mode privilégie xMart et essaie legacy uniquement pour un indicateur confirmé absent ou entièrement vide. Un horodatage manquant ne déclenche pas de basculement. Le résultat indique le backend utilisé.

gho_last_updated("WHS4_100")
gho_last_updated("WHS4_100", backend = "xmart")
gho_last_updated("WHS4_100", backend = "xmart", diagnostics = TRUE)

updates <- lapply(c("WHS4_100", "NCDMORT3070"), gho_last_updated,
                  backend = "legacy")
do.call(rbind, updates)

Les champs sources sont Date pour legacy et Sys_CommitDateUtc pour xMart. DSIR n’a pas établi que Date désigne une modification ou publication officielle ; un commit système xMart peut refléter un traitement. Aucun des deux champs n’est la dernière année d’observation. Chaque requête de date renvoie au plus une ligne. xMart utilise aussi le répertoire et les informations de champs mis en cache. Le mode auto ajoute une petite requête de disponibilité pour l’indicateur entier avant la requête de date. Les échecs de requête et les horodatages manquants ne déclenchent jamais de basculement. Interroger tous les indicateurs à la suite peut prendre beaucoup de temps.

Les huit colonnes par défaut restent inchangées. diagnostics = TRUE ajoute reason, stage, http_status, timestamp_kind, provider_route et provider_indicator, sans requête supplémentaire. directory_not_listed indique un code absent du répertoire lu avec succès, sans prouver que le code GHO est invalide. http_error et request_failed distinguent une erreur HTTP d’un échec de connexion. timestamp_field_missing et timestamp_missing distinguent un champ absent d’une réponse sans horodatage non manquant. Un répertoire accessible ne prouve pas que les requêtes d’observations fonctionnent. checked_at est le début du contrôle, pas une date de récupération ou de modification des données. Des horodatages système identiques ne prouvent pas que les valeurs ont changé ensemble ; utilisez les instantanés pour comparer les valeurs récupérées.

L’API ODD des Nations Unies fournit un horodatage pour toute la base, sans champ équivalent pour les données de chaque indicateur :

Les deux fonctions renvoient une ligne avec source, backend, scope, indicator, updated, timestamp_field, checked_at et status. updated conserve la chaîne et les informations de fuseau horaire d’origine. Un fuseau non précisé n’est pas supposé être UTC. checked_at est l’heure de début de la requête en UTC.

status distingue "ok", "not_available" (aucun horodatage fourni) et "failed" (échec de recherche, de requête ou de validation de la réponse). Un horodatage manquant ne prouve pas l’absence d’observations. Pour les ODD, scope vaut "database", tandis que backend et indicator sont manquants. Cet horodatage ne signifie pas que toutes les séries ont changé au même moment. Les codes de version des séries et les dates de mise à jour des documents de métadonnées ne remplacent pas les dates de mise à jour des données.

Obtenir des indicateurs du GHO

Le parcours habituel comporte trois étapes : rechercher le code, obtenir les données, puis nettoyer la réponse. area accepte un long vecteur ISO3 ; une seule requête peut donc couvrir une région entière.

Étape 1 : rechercher un indicateur

gho_indicators("UHC") |> head()

Choisissez un IndicatorCode dans le résultat et transmettez-le à gho_data() à l’étape suivante.

Étape 2 : obtenir les données

uhc <- gho_data(
  indicator    = "UHC_INDEX_REPORTED",
  spatial_type = "country",
  area         = wpro_cty,
  year_from    = 2015
)

uhc |> glimpse()

Cet exemple demande les données des 28 États Membres de la Région du Pacifique occidental en une seule fois.

Étape 3 : nettoyer la réponse brute

gho_clean() produit la structure commune de DSIR à 15 colonnes, également utilisée par défaut par sdg_clean(). Les colonnes sont source ("gho"), id, indicator, location, iso3, location_name, year, value, value_num, low, high, series et les trois dimensions GHO dim1–dim3. Les lieux connus reçoivent leur libellé ; les colonnes absentes de la réponse sont remplies avec des NA du type approprié.

uhc_clean <- gho_clean(uhc)
uhc_clean

Agréger des indicateurs avec geomean()

Certains indicateurs sont construits à partir de la moyenne géométrique de leurs composantes, plutôt que de leur moyenne arithmétique. Par exemple, l’indice de couverture des services de santé universelle (UHC) agrège 14 indicateurs traceurs par des moyennes géométriques imbriquées. DSIR fournit geomean() :

# Unweighted geometric mean
geomean(c(0.6, 0.8, 0.95))
#> [1] 0.7697002
#> 0.7720589

# With optional weights — useful when tracers have different 
# methodological importance
geomean(c(0.6, 0.8, 0.95), w = c(2, 1, 1))
#> [1] 0.7232343

geomean() applique des règles définies aux valeurs manquantes, nulles et négatives ; consultez ?geomean. Cette fonction réduit les erreurs courantes lors du calcul d’un indice à partir de ses composantes.

Tracer avec theme_dsi() et theme_dsi_facet()

DSIR fournit deux thèmes ggplot2 assortis pour des graphiques dans le style de l’OMS : panneaux simples, grilles discrètes et couleur d’accent cohérente. Ils peuvent remplacer respectivement theme_minimal() et theme_bw() dans les graphiques destinés aux travaux de l’OMS.

En règle générale, utilisez theme_dsi() pour un seul panneau et theme_dsi_facet() pour les facettes. La typographie, les titres et les légendes sont communs. Le thème à facettes ajoute des bordures, un fond clair aux bandeaux et davantage d’espace entre les panneaux.

Un seul panneau : theme_dsi()

theme_dsi() utilise un cadre partiel, des grilles légères et des axes dans le bleu de l’OMS. Les grilles sont présentes dans les deux directions par défaut ; grid = "y" conserve uniquement les lignes horizontales.

uhc_clean |>
  filter(iso3 %in% c("AUS", "CHN", "PHL", "FJI")) |>
  left_join(who_countries, by = "iso3") |>
  ggplot(aes(x = year, y = value_num, group = iso3, color = name_short)) +
  geom_line(linewidth = .8) +
  geom_point(size = 1.8) +
  theme_dsi() +
  labs(
    title    = "UHC Service Coverage Index, selected WPR Member States",
    subtitle = "2015 onwards",
    x = NULL, y = "SCI", color = NULL
  )

Pour les diagrammes en colonnes, ajoutez scale_y_dsi_col(), ou scale_x_dsi_col() lorsque les valeurs sont associées à x. Ces fonctions encapsulent scale_*_continuous() et retirent l’espace ajouté à la base de l’axe, afin que les colonnes touchent celui-ci.

uhc_clean |>
  filter(year == max(year)) |>
  left_join(who_countries, by = "iso3") |>
  arrange(desc(value_num)) |>
  head(10) |>
  ggplot(aes(reorder(name_short, value_num), value_num)) +
  geom_col(fill = "#0093D5") +
  coord_flip() +
  scale_y_dsi_col() +
  theme_dsi(grid = "x") +
  labs(
    title    = "UHC Service Coverage Index, top 10 WPR Member States",
    subtitle = "Latest available year",
    x = NULL, y = "SCI"
  )

Plusieurs facettes : theme_dsi_facet()

La répétition d’axes accentués peut surcharger un graphique à plusieurs panneaux. theme_dsi_facet() utilise des bordures complètes, des bandeaux gris clair et un espacement entre les panneaux pour mieux distinguer les groupes.

uhc_clean |>
  left_join(who_countries, by = "iso3") |>
  filter(is_pic) |>
  ggplot(aes(x = year, y = value_num)) +
  geom_line(color = "#0093D5", linewidth = 0.8) +
  geom_point(color = "#0093D5", size = 1.5) +
  facet_wrap(~ name_short, ncol = 4) +
  theme_dsi_facet() +
  labs(
    title    = "UHC Service Coverage Index, Pacific Island Countries",
    subtitle = "Each panel shows one country's trajectory",
    x = NULL, y = "SCI"
  )

strip_fill permet de modifier le fond des bandeaux, par exemple avec un bleu clair dérivé de la couleur d’accent de l’OMS.

uhc_clean |>
  left_join(who_countries, by = "iso3") |>
  filter(is_pic) |>
  ggplot(aes(x = year, y = value_num)) +
  geom_line(color = "#0093D5", linewidth = 0.8) +
  facet_wrap(~ name_short, ncol = 4) +
  theme_dsi_facet(strip_fill = "#E5F4FB") +
  labs(title = "UHC SCI, PIC — with custom strip colour",
       x = NULL, y = "SCI")

Créer des tableaux avec dsi_flextable_defaults()

dsi_flextable_defaults() définit globalement les valeurs par défaut de flextable dans le style de l’OMS : thème booktabs, en-têtes en gras et marges intérieures modérées. Appelez-la une fois au début du rapport ; les tableaux suivants reprendront ces réglages.

flextable (>= 0.9.0) est une dépendance facultative. Installez-le avec install.packages("flextable") avant d’exécuter les exemples de tableaux.

library(flextable)
dsi_flextable_defaults(font_family = "Geogria")

uhc_clean |>
  filter(year == max(year)) |>
  left_join(who_countries, by = "iso3") |>
  select(name_short, value_num) |>
  arrange(desc(value_num)) |>
  flextable() |>
  set_table_properties("autofit", width = .6) %>%
  set_caption("UHC SCI in WPR, latest year")

Utiliser les indicateurs des ODD

sdg_data() et sdg_clean() suivent le même parcours : obtenir les données, puis les nettoyer. Les codes utilisent le format ODD avec des points, par exemple "3.4.1". La colonne brute value reste une chaîne de caractères, car certaines lignes contiennent "<0.1" ou des notes d’agrégation. Les colonnes nettoyées value_num, low et high sont numériques, avec NA si la conversion est impossible.

Le paramètre facultatif search de sdg_indicators() fonctionne comme celui de gho_indicators() : les mots-clés sont combinés par ET et recherchés dans la description sans distinction de casse. Le filtrage s’effectue côté client, car la liste est courte, environ 250 lignes, et le service n’utilise pas OData.

# All indicators that mention both mortality and cancer
sdg_indicators("mortality cancer")

# Same as above, but with explicit terms (allows whitespace inside a term)
sdg_indicators(c("maternal", "mortality"))

Le paramètre area de sdg_data() et sdg_coverage() accepte soit des codes ISO3, convertis en interne avec iso3_to_m49(), soit des codes M49. Les vecteurs régionaux tels que wpro_cty et afro_cty sont donc utilisables directement. Ne mélangez pas les deux formats dans un même appel.

# ISO3 — regional vector passed straight through
sdg <- sdg_data(
  indicator = "3.4.1",
  area      = wpro_cty
)
sdg |> glimpse()

# M49 also works (e.g. when copy-pasting codes from sdg_areas())
sdg_data("3.4.1", area = c("608", "250"))

Par défaut, sdg_clean() et gho_clean() produisent la même structure à 15 colonnes, combinable avec bind_indicators(). Les lignes ODD renseignent series et, pour les États Membres, iso3 via m49_to_iso3(). Les colonnes GHO dim1–dim3 restent à NA.

Conserver les dimensions nommées des ODD

Les dimensions ODD sont des champs nommés dans sdg$dimensions, distincts des dimensions positionnelles du GHO. La sortie compacte à 15 colonnes les omet. Conservez-les explicitement pour une analyse désagrégée :

raw <- sdg_data("3.8.2", area = "PHL")
unique(raw$dimensions)
sdg_clean(raw, keep_dimensions = TRUE)

Des colonnes de caractères sont ajoutées, par exemple dim_age, dim_location, dim_sex, dim_reporting_type, dim_quantile et dim_type_of_household. Les noms dépendent des dimensions réellement renvoyées. Les codes restent inchangés ; une catégorie absente n’est pas remplacée par un code de population totale. keep_metadata = TRUE conserve aussi les unités et les autres attributs.

Sélectionnez la série et les strates avec les noms et codes exacts de la source :

sdg_data(
  "3.8.2", area = "PHL",
  series = "SH_OOP_XPD_EARNNET40",
  dimensions = list(
    Age = "ALLAGE", Location = "ALLAREA", Sex = "BOTHSEX",
    Quantile = "_T", Type_of_household = "_T"
  )
) |>
  sdg_clean(keep_dimensions = TRUE)

Ces filtres sont appliqués localement après la pagination. Plusieurs valeurs d’une même dimension sont combinées par OU ; différentes dimensions, par ET. Si une dimension demandée est absente, la fonction avertit et renvoie zéro ligne, au lieu d’ignorer la restriction de population.

Le catalogue des Nations Unies pour l’indicateur 3.8.2, vérifié le 30 septembre 2026, contient la série SH_OOP_XPD_EARNNET40, conforme à la définition révisée en 2025. Le code GHO FINANCIALHARDSHIP_PROPORTIONOFPOP comporte aussi des composantes de dépenses de santé importantes et appauvrissantes dans Dim1. Elles ne sont pas des séries distinctes de ce catalogue ODD et ne peuvent pas être reconstituées en conservant les dimensions. Consultez la définition et les composantes de l’OMS.

Comprendre les dimensions et conserver le contexte

sdg_dimensions() présente les catégories et libellés officiels de chaque série, sans télécharger les observations. Les catégories répertoriées ne sont pas forcément observées dans chaque pays.

sdg_dimensions("3.8.2", include_attributes = TRUE)

code contient les codes de l’API JSON utilisés pour filtrer ; sdmx est une autre représentation. kind distingue les dimensions des attributs, tels que les unités et la nature des données.

Pour conserver à la fois le contexte et les dimensions de population :

detailed <- sdg_clean(raw, keep_dimensions = TRUE, keep_metadata = TRUE)
detailed |>
  select(any_of(c("iso3", "year", "value_num", "attr_units", "attr_nature", "data_source")))
head(detailed$footnotes, 1L)

keep_metadata conserve les attributs dans des colonnes attr_*, ainsi que la source, les détails ou la couverture temporelle, la période de base, le type de valeur et l’URL d’information géographique. Les notes et les codes associés d’indicateurs, d’objectifs et de cibles sont des colonnes de listes qui préservent plusieurs éléments. Utilisez RDS pour enregistrer cette structure.

Pour le GHO, affichez directement le type de chaque dimension positionnelle. Le code de difficultés financières ci-dessous était absent du répertoire public xMart au 6 octobre 2026 ; l’exemple choisit donc explicitement le service legacy.

gho_detailed <- gho_data("FINANCIALHARDSHIP_PROPORTIONOFPOP", area = "PHL",
                         backend = "legacy") |>
  gho_clean(keep_dimensions = TRUE, keep_metadata = TRUE)
gho_detailed |>
  select(provider, iso3, year, value_num, dim1_type, dim1, dim2_type, dim2)

Les types proviennent de Dim1Type–Dim3Type pour chaque observation. Ils ne sont ni déduits d’un préfixe ni supposés constants pour l’ensemble d’un indicateur. Les métadonnées GHO comprennent provider, les codes de source, les identifiants d’observation, les commentaires dans footnotes, les types géographiques et temporels, les lieux parents, les dates de mise à jour et les intervalles temporels. Les deux options laissent la sortie par défaut à 15 colonnes inchangée.

sdg_data() vérifie la pagination déclarée et le nombre total de lignes avant le filtrage local. Un téléchargement incomplet produit un avertissement et zéro ligne. sdg_coverage() conserve ces avertissements et accepte les filtres series et dimensions. Sans filtre, les comptes regroupent toutes les strates d’un lieu et d’une série.

Combiner le GHO et les ODD avec bind_indicators()

bind_indicators() empile autant de tables nettoyées que nécessaire. La colonne source, "gho" ou "sdg", permet de filtrer ou de créer des facettes selon l’origine.

Les colonnes supplémentaires, y compris les dimensions ODD nommées, sont conservées. Les entrées qui ne les possèdent pas reçoivent des valeurs manquantes du type approprié. L’empilement n’harmonise pas les codes ni les définitions entre sources.

# Two indicators on the same topic from different APIs:
#   GHO NCDMORT3070 (probability of premature NCD mortality)
#   SDG 3.4.1       (mortality rate from NCDs)
gho_ncd <- gho_data("NCDMORT3070", area = wpro_cty) |> gho_clean()
sdg_ncd <- sdg_data("3.4.1",        area = wpro_cty) |> sdg_clean()
bind_indicators(gho_ncd, sdg_ncd) |> glimpse()

Examiner les séries avec sdg_coverage()

Un indicateur ODD peut contenir plusieurs séries, par exemple des vaccins, des strates par sexe ou des causes de décès, chacune avec sa propre couverture géographique et temporelle. L’exemple "3.b.1" comporte quatre séries de vaccination : DTP3, MCV2, PCV3 et HPV. Les vaccins plus récents ont une couverture temporelle plus courte que DTP3.

sdg_coverage() résume les années et le nombre d’observations par (location, series), afin d’examiner les séries disponibles avant de choisir l’analyse.

sdg_coverage("3.b.1", area = c("156", "608"))
#>   location series      year_min year_max n_obs
#> 1 156      SH_ACS_DTP3     2000     2023    24
#> 2 156      SH_ACS_HPV      2018     2023     6
#> 3 156      SH_ACS_MCV2     2000     2023    24
#> 4 156      SH_ACS_PCV3     2017     2023     7
#> 5 608      SH_ACS_DTP3     2000     2023    24
#> 6 608      SH_ACS_HPV      2017     2023     7
#> 7 608      SH_ACS_MCV2     2000     2023    24
#> 8 608      SH_ACS_PCV3     2014     2023    10

DSIR ne fournit pas d’équivalents ODD de gho_has_data() et gho_count(). Sa conception privilégie l’examen des séries et de leur couverture avec sdg_coverage(), plutôt que des vérifications simples avant le téléchargement.

Pour aller plus loin