knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(didoscalim)
library(magrittr)
library(dplyr, quietly = TRUE, warn.conflicts = FALSE)
# bugfix pour check()
library(stringr)
library(purrr, warn.conflicts = FALSE)
list_datasets() %>%
  filter(str_detect(title, "Données.*fictive")) %>% 
  pwalk(~ delete_dataset(.))

Ce tutorial explique comment utiliser les fonctions add_or_update_dataset(), add_or_update_datafile() et add_or_update_attachment() qui permettent, comme leur nom l'indique, de mettre à jour un objet existant et s'il n'existe pas de le créer.

Un objet est identifié par son titre (et son parent pour les fichiers de données et les fichiers joints). La recherche par le titre se base sur uniquement sur les caractères alphanumériques en minuscule.

Cela a plusieurs conséquences :

  1. vous ne devez pas avoir deux jeux de données avec le même nom, ou deux fichiers de données/fichiers annexes avec le même nom dans un même jeu de données.
  2. il est possible de modifier le titre d'un objet uniquement à la marge (ajout d'une majuscule, suppression d'un espace...)

Toutes ces fonctions vont chercher un objet du même type avec un titre équivalent (cf ci-dessus) et le cas échéant ayant le même parent puis :

Rappel : Afin d'éviter les erreurs de manipulation, il est conseillé de préparer ses scripts de chargement sur l'environnement ECOLE et de les passer après sur PROD. Vous trouverez plus d'info dans la vignette sur les environnements.

L'exemple

Nous souhaitons créer un jeu de données contenant 2 fichiers de données.

La procédure à suivre est la suivante :

  1. créer ou modifier le jeu de données en modifiant la date de fin de couverture temporelle et la date de prochaine mise à jour
  2. créer les fichiers de données ou remplacer les millésimes en modifiant la date de publication et la date de fin de couverture temporelle

Dans les éléments supplémentaires :

créer le jeu de données

# ces variables vont évoluer dans le temps
temporal_coverage_end <- "2020-05-31"
frequency_date <- "2020-06-10"
millesime <- "2020-06"

# cette variable ne change jamais
temporal_coverage_start <- "2000-01-01"

dataset <- add_or_update_dataset(
  title = "Données de consommation mensuelles fictive",
  description = "test",
  topic = "Énergie",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  frequency = "monthly",
  frequency_date = frequency_date
)

frequency_date représente la date de prochaine mise à jour, c'est une valeur fixée au niveau du jeu de données.

temporal_coverage_start et temporal_coverage_end représente respectivement les dates de début et de fin de la couverture temporelle. Elles sont fixées au niveau du jeux de données et également au niveau des fichiers de données.

créer les fichiers de données

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – chaleur et froid",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 0
)

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – gaz et électricité",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 0
)

Le paramètre keep_old_millesimes permet d'indiquer que le méthode doit conserver 0 anciens millésimes, par conséquent elle va supprimer tous les anciens millésimes.

Vous pouvez également passer l'argument check_file_date à TRUE, la méthode vérifiera si le fichier est plus récent que la dernière modification du datafile et si ça n'est pas le cas retournera sans réaliser la mise à jour.

Réaliser les mises à jour

La procédure est la suivante :

  1. modifier le jeu de données en modifiant la date de fin de couverture temporelle et la date de prochaine mise à jour
  2. ajouter des données aux fichiers de données ou remplacer les millésimes et modifier la date de fin de couverture temporelle

Pour ces mises à jour, il suffira de modifier la déclaration des variables d'entêtes et de reprendre le code précédent, les fonctions add_or_update_* s'occupent de tout le reste. Pour publier les données allant jusqu'au 30 juin le code est le suivant :

# nouvelle date de fin
temporal_coverage_end <- "2020-06-30"
# nouvelle date de mise à jour
frequency_date <- "2020-07-10"
# nouvel identifiant de millésime
millesime <- "2020-07"

# toute la suite est strictement identique au code ci-dessus.
temporal_coverage_start <- "2000-01-01"

dataset <- add_or_update_dataset(
  title = "Données de consommation mensuelles fictive",
  description = "test",
  topic = "Énergie",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  frequency = "monthly",
  frequency_date = frequency_date
)

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – chaleur et froid",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 1
)

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – gaz et électricité",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 1
)

Le programme final

Le code précédent est un exemple, il doit entre autre pouvoir vous montrer comment se passe une création et une mise à jour et pour cela, un millésime devant être unique, il doit modifier l'identifiant du millésime à chaque étape.

Une fois que votre programme est prêt, vous pouvez automatiser la génération des variables temporal_coverage_end et frequency_date et supprimer la variable et les paramêtres millesime, add_or_update_datafile() le fixe automatiquemeent à AAAA-MM avec l'année et le mois en cours si elle n'est pas précisée.

Cela donne le code final suivant que vous pouvez lancer tous les mois :

library(lubridate, warn.conflicts = FALSE)

# prend la date du dernier jour du mois précédent
temporal_coverage_end <- ceiling_date(Sys.Date() %m-% months(1), 'month') %m-% days(1)
# prend la date du 9eme jour après le 1er du mois en cours
# cette implémentation est naïve, attention aux jours non travaillés...
frequency_date <- ceiling_date(Sys.Date(), 'month') + days(9)
# cette variable n'est pas indispensable
millesime = format(Sys.time(), "%Y-%m")

# la suite est strictement identique au code précédent.
temporal_coverage_start <- "2000-01-01"

dataset <- add_or_update_dataset(
  title = "Données de consommation mensuelles fictive",
  description = "test",
  topic = "Énergie",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  frequency = "monthly",
  frequency_date = frequency_date
)

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – chaleur et froid",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 1
)

add_or_update_datafile(
  dataset = dataset,
  title = "Données de consommation fictive – gaz et électricité",
  description = "Consommations annuelles et nombre de points de livraison",
  file_name = "augmente.csv",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  millesime = millesime,
  keep_old_millesimes = 1
)

éviter la création d'un objet quand vous voulez faire des mises à jour

Si vos datasets/datafiles sont « stables » et qu'ils doivent juste être mis à jour, vous pouvez utiliser l'option didoscalim_update_only. Les fonctions add_or_update_* lèveront une exception si elles doivent créer un nouvel objet

withr::local_options(didoscalim_update_only = TRUE)

dataset <- add_or_update_dataset(
  title = "Données de consommation mensuelles fictive.",
  description = "test",
  topic = "Énergie",
  temporal_coverage_start = temporal_coverage_start,
  temporal_coverage_end = temporal_coverage_end,
  frequency = "monthly",
  frequency_date = frequency_date
)


dataset <- add_or_update_dataset(
  title = "Un dataset quelconque",
  description = "test",
  topic = "Énergie",
  frequency = "monthly",
  frequency_date = frequency_date
)

quelques conseils



MTES-MCT/didoscalim documentation built on June 14, 2025, 12:21 a.m.