Skip to content
Snippets Groups Projects
Commit d27b7936 authored by ronan.vignard's avatar ronan.vignard
Browse files

Merge branch 'mod_maps' into 'dev'

Création d'une première version de mod_maps

See merge request dreal-pdl/csd/suivi-avis-ae!6
parents 25736b65 b10e95e7
No related branches found
No related tags found
3 merge requests!17Ajout des tableaux de statistiques et correction de divers bugs,!16Ajout des tableaux statistiques et correction de divers bugs,!6Création d'une première version de mod_maps
# Generated by roxygen2: do not edit by hand
export(config_hchart_menu)
export(create_map)
export(generate_aepp_stats_table)
export(generate_consultation_graph)
export(generate_monthly_consultation_graph)
export(generate_pie_chart)
export(get_departement_name)
export(get_trimestre_label)
export(get_type_consultation_name)
export(run_app)
import(config)
import(highcharter)
......@@ -26,6 +30,8 @@ importFrom(dplyr,bind_rows)
importFrom(dplyr,filter)
importFrom(dplyr,full_join)
importFrom(dplyr,group_by)
importFrom(dplyr,left_join)
importFrom(dplyr,mutate)
importFrom(dplyr,n)
importFrom(dplyr,select)
importFrom(dplyr,summarise)
......
#' create_map
#' Crée une carte Leaflet personnalisée
#'
#' Cette fonction génère une carte Leaflet basée sur les données spécifiées.
#'
#' @param table_name Le nom de la table contenant les données géospatiales.
#' @param select_departement Le code du département sélectionné.
#' @param select_annee L'année à considérer pour les données.
#'
#' @return Un objet Leaflet interactif.
#'
#' @import leaflet
#' @import leaflet.extras
#' @importFrom datalibaba importer_data
#' @importFrom sf st_transform
#' @importFrom dplyr filter left_join mutate select
#'
#' @export
create_map <- function(table_name, select_departement, select_annee) {
# Charger les données des tables
data <- importer_data(db = "metier",
schema = "avis_ae",
table = table_name) |> st_transform(4326)
# Charger les données des référentiels
departements <- importer_data(db = "referentiels",
schema = "adminexpress",
table = "n_departement_exp_r52") |> st_transform(4326)
region <- importer_data(db = "referentiels",
schema = "adminexpress",
table = "n_region_exp_r52") |> st_transform(4326)
# Charger le bilan d'activité à partir de la table export_garance
bilan_activite <- create_activity_report() |> filter(annee > 2015)
# Préparer la jointure par l'ajout de la variable numero
data <- data |> mutate(numero = id_dossier)
data$numero = substr(data$numero, nchar(data$numero) - 3, nchar(data$numero))
data$numero = as.integer(data$numero)
# Récupérer les champs departement et annee de bilan_activite par jointure
merged_data <- data |>
left_join(bilan_activite |> select(numero, departement, annee), by = c("numero" = "numero"))
# Filtre par année si une année est sélectionnée
if (select_annee != "Toutes") {
merged_data <- merged_data |> filter(annee == select_annee)
}
# Créer une carte Leaflet
if(select_departement == "Tous") {
map <- leaflet() |>
setView(lng = -0.80, lat = 47.4667, zoom = 8) |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departements,
color = "grey",
opacity = 0.3,
fillOpacity = 0.1) |>
addPolygons(data = region, opacity = 0.3, fillOpacity = 0) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = merged_data,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", merged_data$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", merged_data$intitule_operation))
} else {
departement_selected <- departements |> filter(insee_dep == select_departement)
merged_data <- merged_data |> filter(departement == select_departement)
map <- leaflet() |>
clearBounds() |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departement_selected,
color = "grey",
opacity = 0.3,
fillOpacity = 0.1) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = merged_data,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", merged_data$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", merged_data$intitule_operation))
}
return(map)
}
#' get_departement_name
#'
#' Obtenir le nom d'un département à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un département et renvoie le
#' nom correspondant.
#'
#' @param identifiant L'identifiant du département.
#' @return Le nom du département correspondant à l'identifiant ou NULL si
#' l'identifiant n'est pas trouvé.
#'
#' @export
get_departement_name <- function(identifiant) {
departement_names <- c("Tous" = "Pays de la Loire",
"44" = "Loire-Atlantique",
"49" = "Maine-et-Loire",
"53" = "Mayenne",
"72" = "Sarthe",
"85" = "Vend\u00e9e")
return(departement_names[identifiant])
}
#' get_type_consultation_name
#'
#' Obtenir le nom d'un type de consultation à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un type de consultation et
#' renvoie le nom correspondant.
#'
#' @param identifiant L'identifiant du type de consultation.
#' @return Le nom du type de consultation correspondant à l'identifiant ou
#' NULL si l'identifiant n'est pas trouvé.
#'
#' @export
get_type_consultation_name <- function(identifiant) {
type_consultation_names <- c("AEPP" = "Plans/Programmes",
"AEPP-CC" = "Cas par cas Plans/Programmes",
"AEPP-CC-ADHOC" = "Cas par cas Plans/Programmes ad hoc",
"AEPR" = "Projets",
"AEPR-CC" = "Cas par cas Projets")
return(type_consultation_names[identifiant])
}
#' get_trimestre_label
#'
#' Obtenir le libellé d'un trimestre à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un trimestre et renvoie le
#' libellé correspondant.
#'
#' @param identifiant L'identifiant du trimestre.
#' @return Le libellé du trimestre correspondant à l'identifiant ou NULL si
#' l'identifiant n'est pas trouvé.
#'
#' @export
get_trimestre_label <- function(identifiant) {
trimestre_names <- c("Tous" = "",
"1" = "(1er trimestre)",
"2" = "(2\u00e8me trimestre)",
"3" = "(3\u00e8me trimestre)",
"4" = "(4\u00e8me trimestre)")
return(trimestre_names[identifiant])
}
......@@ -7,5 +7,7 @@ globalVariables(unique(c(
# create_filtered_dataframe:
"numero",
# generate_monthly_consultation_graph:
"mois"
"mois",
# create_map:
"id_dossier", "insee_dep"
)))
......@@ -12,16 +12,38 @@ mod_maps_ui <- function(id){
ns <- NS(id)
tagList(
h1("Cartes"),
mod_selector_ui(ns("selector_6")),
tags$br(),
fluidRow(
column(
width = 2,
selectInput(
inputId = ns("select_departement"),
label = "D\u00e9partement :",
choices = c("Tous" = "Tous",
"Loire-Atlantique" = "44",
"Maine-et-Loire" = "49",
"Mayenne" = "53",
"Sarthe" = "72",
"Vend\u00e9e" = "85")
)
),
column(
width = 2,
selectInput(
inputId = ns("select_annee"),
label = "Ann\u00e9e :",
choices = c("Toutes", year(today()):2016),
selected = "Toutes"
)
)
),
mainPanel(
tabsetPanel(
tabPanel(
"Cas par cas",
h3("D\u00e9cisions de l\'autorit\u00e9 environnementale sur les dossiers d\'examen au cas par cas en Pays de la Loire (AEPR-CC)"),
h3(textOutput(ns("titre_cas_par_cas"))),
fluidRow(
column(width = 12,
leafletOutput(ns("map_cas_par_cas"), height = 700, width = "90%") |>
leafletOutput(ns("map_cas_par_cas"), height = 650, width = "100%") |>
withSpinner(type = getOption("spinner.type", default = 8),
size = getOption("spinner.size", default = 1))
)
......@@ -29,10 +51,10 @@ mod_maps_ui <- function(id){
),
tabPanel(
"Projets",
h3("Avis de l\'autorit\u00e9 environnementale sur les projets soumis \u00e0 \u00e9tude d\'impact en Pays de la Loire (AEPR)"),
h3(textOutput(ns("titre_projets_ae"))),
fluidRow(
column(width = 12,
leafletOutput(ns("map_projets"), height = 700, width = "90%") |>
leafletOutput(ns("map_projets_ae"), height = 650, width = "100%") |>
withSpinner(type = getOption("spinner.type", default = 8),
size = getOption("spinner.size", default = 1))
)
......@@ -45,67 +67,55 @@ mod_maps_ui <- function(id){
#' maps Server Functions
#' @import leaflet
#' @import leaflet.extras
#' @importFrom datalibaba importer_data
#' @importFrom sf st_transform
#' @noRd
mod_maps_server <- function(id, r_global){
moduleServer( id, function(input, output, session){
ns <- session$ns
mod_selector_server("selector_7", r_global = r_global)
# Charger les données des tables
data_cas_par_cas <- importer_data(
db = "metier",
schema = "avis_ae",
table = "r_consultations_cas_par_cas_r52") |> st_transform(4326)
observeEvent(c(input$select_departement, input$select_annee),{
# Création des titres en fonction des inputs sélectionnés
output$titre_cas_par_cas <- renderText({
if(input$select_annee == "Toutes") {
paste0("D\u00e9cisions de l\'autorit\u00e9 environnementale sur les
dossiers d\'examen au cas par cas en ",
get_departement_name(input$select_departement)," (AEPR-CC)")
} else {
paste0("D\u00e9cisions de l\'autorit\u00e9 environnementale sur les
dossiers d\'examen au cas par cas en ",
get_departement_name(input$select_departement)," (AEPR-CC) en ",
input$select_annee)
}
})
data_projets_ae <- importer_data(
db = "metier",
schema = "avis_ae",
table = "r_consultations_projets_ae_r52") |> st_transform(4326)
output$titre_projets_ae <- renderText({
if(input$select_annee == "Toutes") {
paste0("Avis de l\'autorit\u00e9 environnementale sur les projets
soumis \u00e0 \u00e9tude d\'impact en ",
get_departement_name(input$select_departement)," (AEPR)")
} else {
paste0("Avis de l\'autorit\u00e9 environnementale sur les projets
soumis \u00e0 \u00e9tude d\'impact en ",
get_departement_name(input$select_departement)," (AEPR) en ",
input$select_annee)
}
})
#Charger les données des référentiels
departements <- importer_data(
db = "referentiels",
schema = "adminexpress",
table = "n_departement_exp_r52") |> st_transform(4326)
region <- importer_data(
db = "referentiels",
schema = "adminexpress",
table = "n_region_exp_r52") |> st_transform(4326)
# Créer la carte Leaflet
output$map_cas_par_cas <- renderLeaflet({
leaflet() |>
setView(lng = -0.80, lat = 47.4667, zoom = 8) |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departements, opacity = 0.3, fillOpacity = 0.1) |>
addPolygons(data = region, opacity = 0.3, fillOpacity = 0) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = data_cas_par_cas,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", data_cas_par_cas$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", data_cas_par_cas$intitule_operation))
})
# Création des cartes en fonction des inputs sélectionnés
output$map_cas_par_cas <- renderLeaflet({
create_map(
"r_consultations_cas_par_cas_r52",
input$select_departement,
input$select_annee
)
})
output$map_projets <- renderLeaflet({
leaflet() |>
setView(lng = -0.80, lat = 47.4667, zoom = 8) |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departements, opacity = 0.3, fillOpacity = 0.1) |>
addPolygons(data = region, opacity = 0.3, fillOpacity = 0) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = data_projets_ae,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", data_projets_ae$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", data_projets_ae$intitule_operation))
output$map_projets_ae <- renderLeaflet({
create_map(
"r_consultations_projets_ae_r52",
input$select_departement,
input$select_annee
)
})
})
})
......
......@@ -106,43 +106,15 @@ mod_selector_server <- function(id, r_global){
r_global$select_trimestre <- input$select_trimestre
})
# Ajout des libellés pour les valeurs des inputs pour les sous-titres
departement_names <- c("Tous" = "Pays de la Loire",
"44" = "Loire-Atlantique",
"49" = "Maine-et-Loire",
"53" = "Mayenne",
"72" = "Sarthe",
"85" = "Vend\u00e9e")
type_consultation_names <- c("AEPP" = "Plans/Programmes",
"AEPP-CC" = "Cas par cas Plans/Programmes",
"AEPP-CC-ADHOC" = "Cas par cas Plans/Programmes ad hoc",
"AEPR" = "Projets",
"AEPR-CC" = "Cas par cas Projets")
trimestre_names <- c("Tous" = "",
"1" = "(1er trimestre)",
"2" = "(2\u00e8me trimestre)",
"3" = "(3\u00e8me trimestre)",
"4" = "(4\u00e8me trimestre)")
# Création des éléments du titre de la page avec les inputs sélectionnés
observeEvent(input$validate, {
selected_departement <- r_global$select_departement
r_global$departement_name <- departement_names[selected_departement]
selected_type_consultation <- r_global$select_type_consultation
r_global$type_consultation_name <- type_consultation_names[selected_type_consultation]
selected_trimestre <- r_global$select_trimestre
r_global$trimestre_name <- trimestre_names[selected_trimestre]
r_global$select_inputs_names <-
paste(r_global$type_consultation_name, " en ",
r_global$departement_name, " en ",
paste(get_type_consultation_name(r_global$select_type_consultation), " en ",
get_departement_name(r_global$select_departement), " en ",
r_global$select_annee, " ",
r_global$trimestre_name)
get_trimestre_label(r_global$select_trimestre))
})
# Création des bilans d'activité en fonction des inputs sélectionnés
observeEvent(input$validate, {
# Filtrage du data frame export_garance avec les paramètres du menu
......@@ -161,6 +133,7 @@ mod_selector_server <- function(id, r_global){
selected_trimester = input$select_trimestre
)
# Création des bilans d'activité en fonction des inputs sélectionnés
colnames_bilan_activite_aepp <- c(
'Num\u00e9ro',
'D\u00e9partement',
......
......@@ -84,7 +84,7 @@ load_table <- function(table_name) {
# Vérifier la connexion
if (is.null(con)) {
shinyalert("Impossible de se connecter à la base de données.", type = "error")
shinyalert("Impossible de se connecter \u00e0 la base de donn\u00e9es.", type = "error")
return(NULL)
} else {
......@@ -695,8 +695,8 @@ generate_monthly_consultation_graph <- function(consultation_type, bilan_activit
"Cas par cas Projets"
}
short_months <- c("janv.", "fév.", "mars", "avr.", "mai", "juin", "juill.",
"août", "sept.", "oct.", "nov.", "déc.")
short_months <- c("janv.", "f\u00e9v.", "mars", "avr.", "mai", "juin", "juill.",
"ao\u00fbt", "sept.", "oct.", "nov.", "d\u00e9c.")
if (consultation_type %in% c("AEPP", "AEPR")) {
highchart() |>
......@@ -729,3 +729,190 @@ generate_monthly_consultation_graph <- function(consultation_type, bilan_activit
generate_monthly_consultation_graph("AEPP", bilan_activite)
```
```{r function-create_map}
#' Crée une carte Leaflet personnalisée
#'
#' Cette fonction génère une carte Leaflet basée sur les données spécifiées.
#'
#' @param table_name Le nom de la table contenant les données géospatiales.
#' @param select_departement Le code du département sélectionné.
#' @param select_annee L'année à considérer pour les données.
#'
#' @return Un objet Leaflet interactif.
#'
#' @import leaflet
#' @import leaflet.extras
#' @importFrom datalibaba importer_data
#' @importFrom sf st_transform
#' @importFrom dplyr filter left_join mutate select
#'
#' @export
create_map <- function(table_name, select_departement, select_annee) {
# Charger les données des tables
data <- importer_data(db = "metier",
schema = "avis_ae",
table = table_name) |> st_transform(4326)
# Charger les données des référentiels
departements <- importer_data(db = "referentiels",
schema = "adminexpress",
table = "n_departement_exp_r52") |> st_transform(4326)
region <- importer_data(db = "referentiels",
schema = "adminexpress",
table = "n_region_exp_r52") |> st_transform(4326)
# Charger le bilan d'activité à partir de la table export_garance
bilan_activite <- create_activity_report() |> filter(annee > 2015)
# Préparer la jointure par l'ajout de la variable numero
data <- data |> mutate(numero = id_dossier)
data$numero = substr(data$numero, nchar(data$numero) - 3, nchar(data$numero))
data$numero = as.integer(data$numero)
# Récupérer les champs departement et annee de bilan_activite par jointure
merged_data <- data |>
left_join(bilan_activite |> select(numero, departement, annee), by = c("numero" = "numero"))
# Filtre par année si une année est sélectionnée
if (select_annee != "Toutes") {
merged_data <- merged_data |> filter(annee == select_annee)
}
# Créer une carte Leaflet
if(select_departement == "Tous") {
map <- leaflet() |>
setView(lng = -0.80, lat = 47.4667, zoom = 8) |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departements,
color = "grey",
opacity = 0.5,
fillOpacity = 0.1) |>
addPolygons(data = region, opacity = 0.3, fillOpacity = 0) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = merged_data,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", merged_data$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", merged_data$intitule_operation))
} else {
departement_selected <- departements |> filter(insee_dep == select_departement)
merged_data <- merged_data |> filter(departement == select_departement)
map <- leaflet() |>
clearBounds() |>
addTiles() |>
addFullscreenControl() |>
# Ajouter les limites administratives
addPolygons(data = departement_selected,
color = "grey",
opacity = 0.5,
fillOpacity = 0.1) |>
# Ajouter les géométries des tables aux couches de la carte
addPolygons(data = merged_data,
fillOpacity = 0.5,
popup = paste("<strong>Identifiant du dossier:</strong>", merged_data$id_dossier,
"<br><strong>Intitul\u00e9 de l\'op\u00e9ration:</strong>", merged_data$intitule_operation))
}
return(map)
}
```
```{r examples-create_map}
create_map("r_consultations_cas_par_cas_r52", "44", 2019)
```
```{r function-get_departement_name}
#' get_departement_name
#'
#' Obtenir le nom d'un département à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un département et renvoie le
#' nom correspondant.
#'
#' @param identifiant L'identifiant du département.
#' @return Le nom du département correspondant à l'identifiant ou NULL si
#' l'identifiant n'est pas trouvé.
#'
#' @export
get_departement_name <- function(identifiant) {
departement_names <- c("Tous" = "Pays de la Loire",
"44" = "Loire-Atlantique",
"49" = "Maine-et-Loire",
"53" = "Mayenne",
"72" = "Sarthe",
"85" = "Vend\u00e9e")
return(departement_names[identifiant])
}
```
```{r examples-get_departement_name}
nom <- get_departement_name("44")
cat("Le nom du d\u00e9partement est :", nom)
```
```{r function-get_type_consultation_name}
#' get_type_consultation_name
#'
#' Obtenir le nom d'un type de consultation à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un type de consultation et
#' renvoie le nom correspondant.
#'
#' @param identifiant L'identifiant du type de consultation.
#' @return Le nom du type de consultation correspondant à l'identifiant ou
#' NULL si l'identifiant n'est pas trouvé.
#'
#' @export
get_type_consultation_name <- function(identifiant) {
type_consultation_names <- c("AEPP" = "Plans/Programmes",
"AEPP-CC" = "Cas par cas Plans/Programmes",
"AEPP-CC-ADHOC" = "Cas par cas Plans/Programmes ad hoc",
"AEPR" = "Projets",
"AEPR-CC" = "Cas par cas Projets")
return(type_consultation_names[identifiant])
}
```
```{r examples-get_type_consultation_name}
nom <- get_type_consultation_name("AEPP-CC")
cat("Le nom du type de consultation est :", nom)
```
```{r function-get_trimestre_label}
#' get_trimestre_label
#'
#' Obtenir le libellé d'un trimestre à partir de son identifiant.
#'
#' Cette fonction prend en entrée l'identifiant d'un trimestre et renvoie le
#' libellé correspondant.
#'
#' @param identifiant L'identifiant du trimestre.
#' @return Le libellé du trimestre correspondant à l'identifiant ou NULL si
#' l'identifiant n'est pas trouvé.
#'
#' @export
get_trimestre_label <- function(identifiant) {
trimestre_names <- c("Tous" = "",
"1" = "(1er trimestre)",
"2" = "(2\u00e8me trimestre)",
"3" = "(3\u00e8me trimestre)",
"4" = "(4\u00e8me trimestre)")
return(trimestre_names[identifiant])
}
```
```{r examples-get_trimestre_label}
libelle <- get_trimestre_label("3")
cat("Le libell\u00e9 du trimestre est :", libelle)
```
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_create_map.R
\name{create_map}
\alias{create_map}
\title{create_map
Crée une carte Leaflet personnalisée}
\usage{
create_map(table_name, select_departement, select_annee)
}
\arguments{
\item{table_name}{Le nom de la table contenant les données géospatiales.}
\item{select_departement}{Le code du département sélectionné.}
\item{select_annee}{L'année à considérer pour les données.}
}
\value{
Un objet Leaflet interactif.
}
\description{
Cette fonction génère une carte Leaflet basée sur les données spécifiées.
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_get_name_from_input_id.R
\name{get_departement_name}
\alias{get_departement_name}
\title{get_departement_name}
\usage{
get_departement_name(identifiant)
}
\arguments{
\item{identifiant}{L'identifiant du département.}
}
\value{
Le nom du département correspondant à l'identifiant ou NULL si
l'identifiant n'est pas trouvé.
}
\description{
Obtenir le nom d'un département à partir de son identifiant.
}
\details{
Cette fonction prend en entrée l'identifiant d'un département et renvoie le
nom correspondant.
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_get_name_from_input_id.R
\name{get_trimestre_label}
\alias{get_trimestre_label}
\title{get_trimestre_label}
\usage{
get_trimestre_label(identifiant)
}
\arguments{
\item{identifiant}{L'identifiant du trimestre.}
}
\value{
Le libellé du trimestre correspondant à l'identifiant ou NULL si
l'identifiant n'est pas trouvé.
}
\description{
Obtenir le libellé d'un trimestre à partir de son identifiant.
}
\details{
Cette fonction prend en entrée l'identifiant d'un trimestre et renvoie le
libellé correspondant.
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/fct_get_name_from_input_id.R
\name{get_type_consultation_name}
\alias{get_type_consultation_name}
\title{get_type_consultation_name}
\usage{
get_type_consultation_name(identifiant)
}
\arguments{
\item{identifiant}{L'identifiant du type de consultation.}
}
\value{
Le nom du type de consultation correspondant à l'identifiant ou
NULL si l'identifiant n'est pas trouvé.
}
\description{
Obtenir le nom d'un type de consultation à partir de son identifiant.
}
\details{
Cette fonction prend en entrée l'identifiant d'un type de consultation et
renvoie le nom correspondant.
}
test_that("multiplication works", {
expect_equal(2 * 2, 4)
})
test_that("multiplication works", {
expect_equal(2 * 2, 4)
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment