-
Notifications
You must be signed in to change notification settings - Fork 1
/
README.Rmd
386 lines (273 loc) · 27.8 KB
/
README.Rmd
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
---
output: github_document
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "",
out.width = "100%"
)
options(tibble.print_min = 5, tibble.print_max = 5)
```
```{r message=FALSE, warning=FALSE, include=FALSE}
# 1. Source functions ----
source("code/00_functions/graphical_par.R")
source("code/00_functions/theme_graph.R")
source("code/00_functions/data_descriptors.R")
# 2. Required packages ----
library(tidyverse) # Core tidyverse packages
library(sf)
sf_use_s2(FALSE)
library(knitr)
library(readxl)
# 3. Set theme_graph() as the default ggplot theme ----
theme_set(theme_graph())
# 4. Load data ----
load("data/09_gcrmndb_benthos.RData")
data_benthos <- synthetic_data %>%
filter(datasetID != "0009") # Remove XL Catlin Seaview Survey
rm(synthetic_data)
```
# gcrmndb_benthos <img src='figs/hex_logo.png' align="right" height="138.5" />
![status](https://img.shields.io/badge/status-in%20dev.-blue)
![version](https://img.shields.io/badge/version-0.0.0-blue)
## Table of Contents
* [1. Introduction](#1-introduction)
* [1.1 What is the GCRMN?](#11-what-is-the-gcrmn)
* [1.2 Coral reef monitoring](#12-coral-reef-monitoring)
* [1.3 Why this repository?](#13-why-this-repository)
* [1.4 How to contribute?](#14-how-to-contribute)
* [2. Data integration](#2-data-integration)
* [2.1 Definitions](#21-definitions)
* [2.2 Workflow](#22-workflow)
* [3. Description of variables](#3-description-of-variables)
* [4. Quality checks](#4-quality-checks)
* [5. List of individual datasets](#5-list-of-individual-datasets)
* [6. Description of the synthetic dataset](#6-description-of-the-synthetic-dataset)
* [7. Sponsors](#7-sponsors)
* [8. References](#8-references)
* [9. Reproducibility parameters](#9-reproducibility-parameters)
## 1. Introduction
### 1.1 What is the GCRMN?
The [*Global Coral Reef Monitoring Network*](https://gcrmn.net/) (GCRMN) is an operational network of the [*International Coral Reef Initiative*](https://icriforum.org/) (ICRI) aiming to provide the best available scientific information on the status and trends of coral reef ecosystems for their conservation and management. The GCRMN is a global network of scientists, managers and organisations that monitor the condition of coral reefs throughout the world, operating through ten regional nodes.
### 1.2 Coral reef monitoring
While coral reefs provide many ecosystem services to human populations and host immense biodiversity, they are directly or indirectly threatened by human activities. To understand what are the main drivers of coral reefs' resilience in the Anthropocene, and to appropriately inform environmental policies that aim to protect these ecosystems, it is necessary to have data describing how coral reef integrity is changing over space and time.
Such data are acquired from ecological monitoring, which consist of repetitive measurements of a specified set of ecological variables at one or more locations over an extended period of time ([Vos *et al.*, 2000](https://link.springer.com/article/10.1023/A:1006139412372)). Coral reef monitoring is usually assessed at local scale by different actors (*e.g.* research institutes, governments, NGOs), using different data standards (*i.e.* using different variable names and units). Hence, it exist numerous heterogeneous datasets based on coral reef monitoring in the world, which represent a major challenge to assess status and trends of coral reefs at larger spatial scales.
### 1.3 Why this repository?
This repository aims to gather individual datasets on benthic cover that have been acquired in the world's coral reefs over the last decades and to integrate them into a unique synthetic dataset. This dataset, named `gcrmndb_benthos`, is used to produce GCRMN reports on status and trends of coral reefs. In addition to its use for the production of GCRMN reports, this dataset can possibly be used for macroecological analyses, although this utilization is restricted to open access individual datasets integrated. Finally, this repository constitutes an inventory of existing data on benthic cover in coral reefs (see **Table 5**), and represents a means to change the culture around data towards the FAIR principles ([Wilkinson *et al.*, 2016](https://www.nature.com/articles/sdata201618)), and to preserve these data for future generations.
**It is important to note that the `gcrmndb_benthos` is a code repository, which consist of a hub to store the code used for data integration, and not a data repository.**
### 1.4 How to contribute?
If you would like to contribute to this initiative by providing a dataset on benthic cover monitoring data acquired in coral reefs, you can contact Jérémy Wicquart.
Because the GCRMN is a network based on trust, we are very vigilant regarding data authorship. **You will always remained the owner of the dataset you share** within the `gcrmndb_benthos`. You can control the use that will be made of your dataset by signing a data sharing agreement. Any new use of your dataset made by the GCRMN will be the object of a request sent by email. You are free to remove your dataset from the `gcrmndb_benthos` at any time. Feel free to provide any suggestions by email on the data integration process or unincluded individual datasets.
## 2. Data integration
### 2.1 Definitions
**Table 1.** Definition of main terms used in this README.
| Term | Definition |
|-----------------------:|:----------------------------------------------------------------------------------------------|
| Dataset | A collection of related sets of information that is composed of separate elements (data files) but can be manipulated as a unit by a computer. |
| Data aggregator | Data analyst responsible for the data integration process. |
| Data integration | Process of combining, merging, or joining data together, in order to make what were distinct, multiple data objects, into a single, unified data object ([Schildhauer, 2018](https://link.springer.com/chapter/10.1007/978-3-319-59928-1_8)).|
| Data provider | A person or an institution sharing a dataset for which they have been or are involved in the acquisition of the data contained in the dataset. |
| Data standardization | Process of converting the data format of a given dataset to a common data format (*i.e.* variables names and units). Data standardization is the preliminary step of data integration. |
| Synthetic dataset | A dataset resulting from the integration of multiple existing datasets ([Poisot *et al*., 2016](https://onlinelibrary.wiley.com/doi/10.1111/ecog.01941)). |
### 2.2 Workflow
![](figs/workflow.png)
**Figure 1.** Illustration of the data integration workflow used for the creation of the `gcrmndb_benthos` synthetic dataset (see [Wicquart *et al.*, 2022](https://www.sciencedirect.com/science/article/pii/S1574954121003344)). *EEZ* = Economic Exclusive Zone, *NCBI* = National Center for Biotechnology Information.
## 3. Description of variables
**Table 2.** Description of variables included in the `gcrmndb_benthos` synthetic dataset. The icons for the variables categories (`Cat.`) represents :memo: = description variables, :globe_with_meridians: = spatial variables, :calendar: = temporal variables, :straight_ruler: = methodological variables, :crab: = taxonomic variables, :chart_with_upwards_trend: = metric variables. Variables names (except *region*, *subregion*, *ecoregion*, *category*, *subcategory*, and *condition*) correspond to [DarwinCore terms](https://dwc.tdwg.org/terms).
| # | Variable | Cat. | Type | Description |
|----:|:----------------------|:--------------------------:|:----------|:-------------------------------------------------------------------------------------------------------|
| 1 | datasetID | :memo: | Factor | ID of the dataset |
| 2 | region | :globe_with_meridians: | Factor | GCRMN region (see [gcrmn_regions](https://github.com/JWicquart/gcrmn_regions)) |
| 3 | subregion | :globe_with_meridians: | Factor | GCRMN subregion (see [gcrmn_regions](https://github.com/JWicquart/gcrmn_regions)) |
| 4 | ecoregion | :globe_with_meridians: | Factor | Marine Ecoregion of the World (see [Spalding et al, 2007](https://doi.org/10.1641/B570707)) |
| 5 | country | :globe_with_meridians: | Factor | Country (obtained from [World EEZ v12](https://www.marineregions.org/downloads.php) (*SOVEREIGN1*)) |
| 6 | territory | :globe_with_meridians: | Character | Territory (obtained from [World EEZ v12](https://www.marineregions.org/downloads.php) (*TERRITORY1*)) |
| 7 | locality | :globe_with_meridians: | Character | Site name |
| 8 | habitat | :globe_with_meridians: | Factor | Habitat |
| 9 | parentEventID | :globe_with_meridians: | Integer | Transect ID |
| 10 | eventID | :globe_with_meridians: | Integer | Quadrat ID |
| 11 | decimalLatitude | :globe_with_meridians: | Numeric | Latitude (*decimal, EPSG:4326*) |
| 12 | decimalLongitude | :globe_with_meridians: | Numeric | Longitude (*decimal, EPSG:4326*) |
| 13 | verbatimDepth | :globe_with_meridians: | Numeric | Depth (*m*) |
| 14 | year | :calendar: | Integer | Four-digit year |
| 15 | month | :calendar: | Integer | Integer month |
| 16 | day | :calendar: | Integer | Integer day |
| 17 | eventDate | :calendar: | Date | Date (*YYYY-MM-DD*, ISO 8601) |
| 18 | samplingProtocol | :straight_ruler: | Character | Description of the method used to acquire the measurement |
| 19 | recordedBy | :straight_ruler: | Character | Name of the person who acquired the measurement |
| 20 | category | :crab: | Factor | Benthic category |
| 21 | subcategory | :crab: | Factor | Benthic subcategory |
| 22 | condition | :crab: | Character | |
| 23 | phylum | :crab: | Character | Phylum |
| 24 | class | :crab: | Character | Class |
| 25 | order | :crab: | Character | Order |
| 26 | family | :crab: | Character | Family |
| 27 | genus | :crab: | Character | Genus |
| 28 | scientificName | :crab: | Character | Species |
| 29 | measurementValue | :chart_with_upwards_trend: | Numeric | Percentage cover |
**Table 3.** Description of levels for variables `category` and `subcategory` (see **Table 2**).
| category | subcategory | Description |
|:------------:|:--------------------|:-------------------------------------------------------------------|
| Abiotic | Rock | |
| | Rubble | |
| | Sand | |
| | Silt | |
| Algae | Coralline algae | |
| | Cyanobacteria | |
| | Macroalgae | |
| | Turf algae | |
| Hard coral | | |
| Other fauna | | |
| Seagrass | | |
## 4. Quality checks
**Table 4.** List of quality checks used for the `gcrmndb_benthos` synthetic dataset. Inspired by [Vandepitte *et al*, 2015](https://doi.org/10.1093/database/bau125). The icons for the variables categories (`Cat.`) represents: :globe_with_meridians: = spatial variables, :calendar: = temporal variables, :chart_with_upwards_trend: = metric variables. EEZ = Economic Exclusive Zone.
| # | Cat. | Variables | Questions |
|:--:|:--------------------------:|--------------------------------------|:--------------------------------------------------------------------------------|
| 1 | :globe_with_meridians: | `decimalLatitude` `decimalLongitude` | Are the latitude and longitude available? |
| 2 | :globe_with_meridians: | `decimalLatitude` | Is the latitude within its possible boundaries (*i.e.* between -90 and 90)? |
| 3 | :globe_with_meridians: | `decimalLongitude` | Is the longitude within its possible boundaries (*i.e.* between -180 and 180)? |
| 4 | :globe_with_meridians: | `decimalLatitude` `decimalLongitude` | Is the site within the coral reef distribution area (100 km buffer)? |
| 5 | :globe_with_meridians: | `decimalLatitude` `decimalLongitude` | Is the site located within a GCRMN region? |
| 6 | :globe_with_meridians: | `decimalLatitude` `decimalLongitude` | Is the site located within an EEZ (1 km buffer)? |
| 7 | :calendar: | `year` | Is the year available? |
| 8 | :chart_with_upwards_trend: | `measurementValue` | Is the sum of the percentage cover of benthic categories within the sampling unit greater than 0 and lower than 100? |
| 9 | :chart_with_upwards_trend: | `measurementValue` | Is the percentage cover of a given benthic category (*i.e.* a row) greater than 0 and lower than 100? |
## 5. List of individual datasets
**Table 5.** List of individual datasets integrated in the `gcrmndb_benthos` synthetic dataset. The column *datasetID* is the identifier of individual datasets integrated, *rightsHolder* is the person or organization owning or managing rights over the resource, *accessRights* is the indication of the security status of the resource, *type* is the type of individual dataset storage and/or acquisition (*Ar.* = article, *Db.* = database, *Me.* = [MERMAID](https://dashboard.datamermaid.org/), *Pa.* = data paper, *Rc.* = [ReefCloud](https://reefcloud.ai/dashboard/), *Rp.* = data repository, *Sh.* = data sharing), *modified* is the date (YYYY-MM-DD) of the last version of the individual dataset, *aggregator* is the name of the person in charge of the data integration for the individual dataset considered. The column names (except *aggregator*) correspond to [DarwinCore terms](https://dwc.tdwg.org/terms).
```{r echo=FALSE, message=FALSE, warning=FALSE}
read_xlsx(path = "data/05_data-sources.xlsx", sheet = 1) %>%
select(datasetID, rightsHolder, dataset_link, accessRights, type, modified, aggregator) %>%
mutate(modified = as.character(modified),
across(c("accessRights", "dataset_link", "type", "modified"), ~replace_na(.x, "")),
rightsHolder = ifelse(dataset_link == "",
rightsHolder,
paste0("[", rightsHolder, "](", dataset_link, ")")),
type = str_replace_all(type, c("article" = "Ar.",
"database" = "Db.",
"mermaid" = "Me.",
"reefcloud" = "Rc.",
"data paper" = "Pa.",
"data repository" = "Rp.",
"data sharing" = "Sh.")),
rightsHolder = str_replace_all(rightsHolder, "C2O Pacific", "C~2~O Pacific")) %>%
select(datasetID, rightsHolder, accessRights, type, modified, aggregator) %>%
distinct() %>%
kable(align = c("c", "l", "l", "c", "c", "c"))
```
## 6. Description of the synthetic dataset
On the `r lubridate::as_date(Sys.time())`, the `gcrmndb_benthos` synthetic dataset contains a total of **`r format(nrow(data_benthos), big.mark = ",")` observations** (*i.e* rows) representing **`r format(as.numeric(data_descriptors(data_benthos)[1,"nb_sites"]), big.mark = ",")` sites** and **`r format(as.numeric(data_descriptors(data_benthos)[1,"nb_surveys"]), big.mark = ",")` surveys**. The distribution of monitoring sites in time and space is shown in **Figure 2**. An interactive version of this map is available on [Google Earth Engine](https://jeremywicquart.users.earthengine.app/view/gcrmndbbenthos).
```{r message=FALSE, warning=FALSE, include=FALSE}
# 1. Define a CRS to center the map on 160° meridian line ----
crs_selected <- "+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=160 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"
# 2. Load data ----
# 2.1 Land data --
data_land <- st_read("data/10_background-shp/ne_10m_land/ne_10m_land.shp") %>%
st_transform(crs = crs_selected)
# 2.2 Country boundaries data --
data_country <- st_read("data/10_background-shp/ne_10m_admin_0_countries/ne_10m_admin_0_countries.shp") %>%
st_transform(crs = crs_selected)
# 2.3 EEZ --
# 2.3.1 Define the correction offset --
correction_offset <- 180 - 160 # Here 160 is the same value than +lon_0 from crs_selected
# 2.3.2 Define a long and slim polygon that overlaps the meridian line --
correction_polygon <- st_polygon(x = list(rbind(c(-0.0001 - correction_offset, 90),
c(0 - correction_offset, 90),
c(0 - correction_offset, -90),
c(-0.0001 - correction_offset, -90),
c(-0.0001 - correction_offset, 90)))) %>%
st_sfc() %>%
st_set_crs(4326)
# 2.3.3 Load and transform data --
data_eez <- st_read("data/07_data-eez/02_clean/eez_v12.shp") %>%
st_transform(crs = 4326) %>%
st_make_valid() %>%
st_difference(correction_polygon) %>%
st_transform(crs_selected)
# 3. Extract site coordinates ----
data_benthos_coords <- data_benthos %>%
select(decimalLatitude, decimalLongitude, year) %>%
distinct() %>%
group_by(decimalLatitude, decimalLongitude) %>%
summarise(interval_years = max(year) - min(year)) %>%
ungroup() %>%
mutate(interval_class = cut(interval_years,
breaks = c(-Inf, 1, 5, 10, 15, Inf),
labels = c("1", "2-5", "6-10", "11-15", ">15"))) %>%
arrange(interval_class) %>%
st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), crs = 4326) %>%
st_transform(., crs = crs_selected)
# 4. Make the plot ----
plot_map <- ggplot() +
geom_sf(data = data_eez, fill = NA, col = "lightgrey") +
geom_sf(data = data_land) +
geom_sf(data = data_country) +
geom_sf(data = data_benthos_coords, aes(color = interval_class), size = 1) +
# Graphical aspects
coord_sf(ylim = c(-5000000, 5000000), expand = FALSE) +
guides(colour = guide_legend(title.position = "top", title.hjust = 0.5, override.aes = list(size = 5))) +
scale_color_manual(values = c("#fac484", "#f8a07e", "#ce6693", "#a059a0", "#5c53a5")) +
theme(text = element_text(family = font_choose_map),
panel.border = element_rect(fill = NA, color = "black", linewidth = 1),
axis.title = element_blank(),
axis.text.x.top = element_text(),
legend.position = "top",
legend.direction = "horizontal",
legend.justification = "center",
legend.box = NULL,
legend.box.margin = margin(0, 0, 0, 0, "cm"),
legend.box.background = element_blank(),
legend.background = element_rect(colour = NA, fill = "white"),
legend.key = element_rect(fill = NA, colour = NA),
legend.key.size = unit(1.2, "lines"),
legend.key.height = NULL,
legend.key.width = NULL) +
labs(col = "Monitoring duration (years)")
# 5. Save the plot ----
ggsave(filename = "figs/map_sites.png", plot = plot_map, width = 10, height = 3.5)
```
![](figs/map_sites.png)
**Figure 2.** Map of the distribution of benthic cover monitoring sites for which data are included within the `gcrmndb_benthos` synthetic dataset. Light grey polygons represents economic exclusive zones. Colours corresponds to monitoring duration which is the difference, for each site, between the first and last years with data. Note that the datasetID 0009 is not included in this map, due to the very large number of sites and a monitoring method that differs from those of the other datasets.
**Table 6.** Summary of the content of the `gcrmndb_benthos` synthetic dataset per GCRMN region. EAS = East Asian Seas, ETP = Eastern Tropical Pacific, WIO = Western Indian Ocean. The total number of datasets integrated within the `gcrmndb_benthos` can differ from the sum of the column `Datasets (n)`, as some datasets includes sites in different GCRMN regions. Note that the datasetID 0009 is not included in this table, due to the very large number of sites and a monitoring method that differs from those of the other datasets.
```{r echo=FALSE, message=FALSE}
data_benthos %>%
group_by(region) %>%
data_descriptors() %>%
bind_rows(., data_benthos %>%
data_descriptors() %>%
mutate(region = "Global (all regions)", .before = nb_sites)) %>%
mutate(across(c(nb_sites, nb_surveys), ~format(.x, big.mark = ",", scientific = FALSE))) %>%
kable(.,
col.names = c("GCRMN region", "Sites (n)", "Surveys (n)", "Datasets (n)", "First year", "Last year"),
align = c("r", "r", "r", "r", "c", "c"))
```
**Table 7.** Summary of the content of the `gcrmndb_benthos` synthetic dataset per country and territory. The total number of datasets integrated within the `gcrmndb_benthos` can differ from the sum of the column `Datasets (n)`, as some datasets includes sites in different territories. Note that the datasetID 0009 is not included in this table, due to the very large number of sites and a monitoring method that differs from those of the other datasets.
```{r echo=FALSE, message=FALSE}
data_benthos %>%
group_by(country, territory) %>%
data_descriptors() %>%
mutate(across(c(nb_sites, nb_surveys), ~format(.x, big.mark = ",", scientific = FALSE))) %>%
kable(.,
col.names = c("Country", "Territory", "Sites (n)", "Surveys (n)", "Datasets (n)", "First year", "Last year"),
align = c("r", "l", "r", "r", "r", "c", "c"))
```
## 7. Sponsors
The following organizations have funded the realization of the `gcrmndb_benthos` synthetic dataset:
* The Prince Albert II of Monaco Foundation
* French Ministry of Ecological Transition
## 8. References
* Poisot, T., Gravel, D., Leroux, S., Wood, S. A., Fortin, M. J., Baiser, B., ... & Stouffer, D. B. (**2016**). [Synthetic datasets and community tools for the rapid testing of ecological hypotheses](https://onlinelibrary.wiley.com/doi/10.1111/ecog.01941). *Ecography*, 39(4), 402-408.
* Schildhauer, M. (**2018**). [Data integration: Principles and practice](https://link.springer.com/chapter/10.1007/978-3-319-59928-1_8). In: Recknagel, F., Michener, W.K. (Eds.), *Ecological Informatics*. Springer, pp. 129–157.
* Spalding, M. D., Fox, H. E., Allen, G. R., Davidson, N., Ferdaña, Z. A., Finlayson, M. A. X., [...] & Robertson, J. (**2007**). [Marine ecoregions of the world: a bioregionalization of coastal and shelf areas](https://doi.org/10.1641/B570707). *BioScience*, 57(7), 573-583.
* Vandepitte, L., Bosch, S., Tyberghein, L., Waumans, F., Vanhoorne, B., Hernandez, F., [...] and Mees, J. (**2015**). [Fishing for data and sorting the catch: assessing the data quality, completeness and fitness for use of data in marine biogeographic databases](https://doi.org/10.1093/database/bau125). *Database*.
* Vos, P., E. Meelis, and W. J. Ter Keurs (**2000**). [A Framework for the Design of Ecological Monitoring Programs as a Tool for Environmental and Nature Management](https://link.springer.com/article/10.1023/A:1006139412372). Environmental Monitoring and Assessment* 61(3): 317–44.
* Wicquart, J., Gudka, M., Obura, D., Logan, M., Staub, F., Souter, D., & Planes, S. (**2022**). [A workflow to integrate ecological monitoring data from different sources](https://www.sciencedirect.com/science/article/pii/S1574954121003344). *Ecological Informatics*, 68, 101543.
* Wieczorek J, Bloom D, Guralnick R, Blum S, Döring M, et al. (**2012**). [Darwin Core: An Evolving Community-Developed Biodiversity Data Standard](https://doi.org/10.1371/journal.pone.0029715). *PLoS ONE* 7(1): e29715.
* Wilkinson, M. D., Dumontier, M., Aalbersberg, I. J., Appleton, G., Axton, M., Baak, A., ... & Mons, B. (**2016**). [The FAIR Guiding Principles for scientific data management and stewardship](https://www.nature.com/articles/sdata201618). *Scientific data*, 3(1), 1-9.
## 9. Reproducibility parameters
```{r echo=FALSE, message=FALSE}
# 1. Print session info ----
devtools::session_info(pkgs = c("tidyverse", "formattable", "DT", "leaflet", "prettydoc",
"sf", "knitr", "rmarkdown", "plotly", "kableExtra", "mermaidr"))
```