diff --git a/R/checkpoints/application2/script.R b/R/checkpoints/application2/script.R index 343a31d..573ffdb 100644 --- a/R/checkpoints/application2/script.R +++ b/R/checkpoints/application2/script.R @@ -28,8 +28,8 @@ df <- df |> # STATISTIQUES AGREGEES --------------------------------------- -fonction_de_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) -fonction_de_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # PYRAMIDE AGES ============================= diff --git a/R/checkpoints/application3/script.R b/R/checkpoints/application3/script.R index c36c8fb..03531bf 100644 --- a/R/checkpoints/application3/script.R +++ b/R/checkpoints/application3/script.R @@ -32,8 +32,8 @@ df <- df |> # STATISTIQUES AGREGEES --------------------------------------- -stat_desc_variable(df |> filter(SEXE == "Homme") |> pull(AGED)) -stat_desc_variable(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # PYRAMIDE AGES ============================= diff --git a/R/checkpoints/application4/script.R b/R/checkpoints/application4/script.R index 87296ae..d9f5f3c 100644 --- a/R/checkpoints/application4/script.R +++ b/R/checkpoints/application4/script.R @@ -32,8 +32,8 @@ df <- df |> # STATISTIQUES AGREGEES --------------------------------------- -stat_desc_variable(df |> filter(SEXE == "Homme") |> pull(AGED)) -stat_desc_variable(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # PYRAMIDE AGES ============================= diff --git a/R/checkpoints/application5_part1/script_ls3.R b/R/checkpoints/application5_part1/script_ls3.R index 536f20a..773c27a 100644 --- a/R/checkpoints/application5_part1/script_ls3.R +++ b/R/checkpoints/application5_part1/script_ls3.R @@ -36,8 +36,8 @@ df <- df |> # STATISTIQUES AGREGEES --------------------------------------- -stat_desc_variable(df |> filter(SEXE == "Homme") |> pull(AGED)) -stat_desc_variable(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # PYRAMIDE AGES ============================= diff --git a/R/checkpoints/application5_part1/script_sspcloud.R b/R/checkpoints/application5_part1/script_sspcloud.R index 91a169b..4d33656 100644 --- a/R/checkpoints/application5_part1/script_sspcloud.R +++ b/R/checkpoints/application5_part1/script_sspcloud.R @@ -41,8 +41,8 @@ df <- df |> # STATISTIQUES AGREGEES --------------------------------------- -stat_desc_variable(df |> filter(SEXE == "Homme") |> pull(AGED)) -stat_desc_variable(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # PYRAMIDE AGES ============================= diff --git a/R/checkpoints/application5_part2/R/functions_stats_desc.R b/R/checkpoints/application5_part2/R/functions_stats_desc.R index fa948a2..23d0da3 100644 --- a/R/checkpoints/application5_part2/R/functions_stats_desc.R +++ b/R/checkpoints/application5_part2/R/functions_stats_desc.R @@ -1,3 +1,48 @@ +decennie_a_partir_annee <- function(annee) { + return(annee - annee %% 10) +} + +#' @title Calcul d'une statistique agrégée +#' +#' @description +#' Cette fonction calcule une statistique agrégée (moyenne, écart-type ou variance) pour un vecteur donné. +#' +#' @param x Un vecteur numérique pour lequel la statistique doit être calculée. +#' @param statistique Le nom de la statistique à calculer. Peut être `"moyenne"`, `"ecart-type"` (ou `"sd"`), ou `"variance"`. Par défaut, `"moyenne"`. +#' @param ... Arguments supplémentaires passés à la fonction de calcul sous-jacente (voir [mean()], [sd()], [var()]). +#' +#' @return La valeur de la statistique agrégée calculée. +#' +#' @details +#' - Pour `"moyenne"`, la fonction utilise [mean()]. +#' - Pour `"ecart-type"` ou `"sd"`, la fonction utilise [sd()]. +#' - Pour `"variance"`, la fonction utilise [var()]. +#' +#' @examples +#' calculer_stat_agregee(rnorm(10)) +#' calculer_stat_agregee(rnorm(10), "ecart-type") +#' calculer_stat_agregee(rnorm(10), "variance") +#' +#' @export + +calculer_stat_agregee <- function(x, statistique = "moyenne", ...) { + + stopifnot(is.numeric(x), + is.character(statistique), + statistique %in% c("moyenne", "ecart-type", "sd", "variance")) + + if (statistique == "moyenne") { + resultat <- mean(x, na.rm = TRUE, ...) + } else if (statistique == "ecart-type" || statistique == "sd") { + resultat <- sd(x, na.rm = TRUE, ...) + } else if (statistique == "variance") { + resultat <- var(x, na.rm = TRUE, ...) + } + + return(resultat) +} + + # Fonction pour générer une pyramide des âges generer_pyramide_ages <- function(df) { print("Pyramide des âges de la population française") diff --git a/R/checkpoints/application5_part2/main_sspcloud.R b/R/checkpoints/application5_part2/main_sspcloud.R index 2f802c4..063344d 100644 --- a/R/checkpoints/application5_part2/main_sspcloud.R +++ b/R/checkpoints/application5_part2/main_sspcloud.R @@ -47,8 +47,8 @@ part_seniors <- compute_part_seniors_by_dep(bucket_path) # STATISTIQUES AGREGEES --------------------------------------- -stat_desc_variable(df |> filter(SEXE == "Homme") |> pull(AGED)) -stat_desc_variable(df |> filter(SEXE == "Femme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Homme") |> pull(AGED)) +calculer_stat_agregee(df |> filter(SEXE == "Femme") |> pull(AGED)) # Pyramide des âges diff --git a/slides/applications_r/_application5.qmd b/slides/applications_r/_application5.qmd index 510e733..f4f2579 100644 --- a/slides/applications_r/_application5.qmd +++ b/slides/applications_r/_application5.qmd @@ -1,6 +1,6 @@ ## Application 5 {.smaller} -:::: {.callout-tip .nonincremental collapse="true" icon=false} +:::: {.callout-tip .nonincremental collapse="true" icon=false .nonincremental} ## Partie 1 : Transition vers le stockage `S3` ::: {.justify} @@ -81,32 +81,40 @@ departements <- aws.s3::s3read_using( ::: + + ## Application 5 {.smaller} -:::: {.callout-tip collapse="true" icon=false} +:::: {.callout-tip collapse="true" icon=false .nonincremental} ## Partie 2 : Orchestrer sa chaîne de production -Au fil des chapitres précédents, nous avons appliqué un ensemble de bonnes pratiques à notre chaîne de production pour accroître sa qualité et sa maintenabilité. Néanmoins, celle-ci est encore sous la forme d'un unique *script*. +::: {.justify} +Au fil des chapitres précédents, nous avons appliqué un ensemble de bonnes pratiques à notre chaîne de production pour accroître sa qualité et sa maintenabilité. Néanmoins, celle-ci est encore sous la forme d'un unique *script*. De manière générale, on a plutôt envie de **modéliser les étapes d'une chaîne comme une série de fonctions, avec un script "chef d'orchestre"** qui les appelle dans le bon ordre. +::: + +* Créer les scripts suivants et inspecter leur contenu respectif : + + `R/functions_import.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_import.R)) + + `R/functions_stats_desc.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_stats_desc.R)) + + `R/functions_models.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_models.R)) -De manière générale, on a plutôt envie de modéliser les étapes d'une chaîne comme une série de fonctions, avec une fonction "cheffe d'orchestre" qui appelle les autres dans le bon ordre. +* Modifier `script.R` pour qu'il appelle les fonctions des scripts précédemment créés, avec les paramètres pertinents -::: {.nonincremental} +* Renommer `script.R` en `main.R`, une convention qui permet de comprendre que le script est le **"point d'entrée"** du projet -1. Créer les scripts suivants: - * `R/functions_import.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_import.R)) - * `R/functions_stats_desc.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_stats_desc.R)) - * `R/functions_models.R` ([contenu](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/R/functions_models.R)) +* En vue de sortir du mode interactif et aller vers le **mode batch**, exécuter le script `main.R` via le terminal avec les commandes suivante : -2. Modifier `main.R` pour tenir compte de la modularisation ([version {{< fa brands github >}} + sspcloud](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/main_sspcloud.R) ou [version {{< fa brands gitlab >}} + LS3](https://raw.githubusercontent.com/InseeFrLab/formation-bonnes-pratiques-git-R/refs/heads/main/R/checkpoints/application5_part2/main_sspcloud.R)) +```bash +cd nom_du_projet +Rscript main.R &> main.log # Redirige stdout et stderr vers un fichier +``` -3. Passer la souris sur une des nouvelles fonctions et faire F1 +* Analyser les *logs* générés dans le fichier `main.log` -::: +::::::: -:::: -::: {.callout-note} +::: {.callout-note .nonincremental} ## `targets`: un orchestrateur formel On aurait pu également utiliser un **orchestrateur** dédié pour effectuer cette tâche, comme le package [targets](https://books.ropensci.org/targets/). Les plus curieux d'entre vous pourront aller voir [le chapitre et les exercices](https://github.com/InseeFrLab/formation-bonnes-pratiques-git-R/blob/main/slides/legacy/targets.qmd) qui lui étaient auparavant dédiés dans cette formation.