La geomorfometría se encarga de cuantificar, a partir de un Modelo Digital de Elevación (DEM), las características morfológicas de la superficie terrestre. Dos de los atributos de terreno más utilizados son la pendiente (slope), que expresa la inclinación del terreno, y la orientación (aspect), que indica hacia qué dirección cardinal está expuesta cada ladera. Ambos atributos son fundamentales en agronomía, ya que condicionan procesos como la escorrentía superficial, la erosión, la exposición solar y, en consecuencia, la aptitud de un terreno para determinados usos agrícolas.
En este cuaderno se calculan la pendiente y la orientación del terreno para el departamento del Putumayo, a partir del Modelo Digital de Elevación obtenido previamente en el cuaderno Procesamiento y análisis de datos de elevación para el departamento del Putumayo. Para el cálculo de los atributos se emplea el paquete MultiscaleDTM, y para obtener estadísticas de pendiente por municipio se utiliza el paquete exactextractr. Finalmente, los resultados se visualizan mediante mapas interactivos construidos con leaflet.
Los paquetes MultiscaleDTM y exactextractr
deben instalarse previamente desde la Consola de RStudio, y no desde
este chunk, para evitar reinstalaciones innecesarias cada vez que se
ejecuta el cuaderno.
# EJECUTAR SOLO UNA VEZ, DESDE LA CONSOLA
# paquetes <- c("MultiscaleDTM", "exactextractr")
# install.packages(paquetes)
Antes de cargar las librerías se limpia la memoria de trabajo, con el fin de evitar conflictos con objetos generados en sesiones anteriores:
rm(list = ls())
A continuación se cargan las librerías necesarias para el desarrollo del cuaderno:
library(sf)
library(terra)
library(leaflet)
library(MultiscaleDTM)
library(exactextractr)
| Librería | Descripción |
|---|---|
| sf | Lectura y manipulación de la capa vectorial de municipios. |
| terra | Lectura, recorte, reproyección y procesamiento del DEM. |
| MultiscaleDTM | Cálculo de atributos geomorfométricos (pendiente y orientación). |
| exactextractr | Cálculo de estadísticas zonales (pendiente media y clase dominante por municipio). |
| leaflet | Construcción de los mapas interactivos. |
Durante la ejecución de los chunks es importante prestar atención a
los mensajes de advertencia relacionados con conflictos entre funciones
de distintos paquetes (por ejemplo, terra::extract frente a
tidyr::extract). Para evitar ambigüedades, en este cuaderno
las funciones se invocan siempre con la notación
paquete::función.
MultiscaleDTM calcula atributos geomorfométricos
multiescala a partir de un Modelo Digital de Elevación regularmente
gridado, empleando una ventana móvil (moving window) de tamaño
definido por el usuario. En este cuaderno se utiliza la función
SlpAsp(), que calcula simultáneamente la pendiente y la
orientación del terreno dentro de dicha ventana. Puede consultarse la
documentación completa de la función escribiendo ?SlpAsp en
la Consola.
Se carga el DEM del Putumayo generado y almacenado previamente en formato GeoTIFF:
dem <- terra::rast("Putumayo/elev_Putumayo_z10.tif")
dem
## class : SpatRaster
## size : 3584, 5120, 1 (nrow, ncol, nlyr)
## resolution : 0.0006866186, 0.0006866186 (x, y)
## extent : -77.34375, -73.82826, -0.7033042, 1.757537 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source : elev_Putumayo_z10.tif
## name : elev_Putumayo_z10
## min value : -540
## max value : 4186
Con el fin de evitar problemas de memoria durante el cálculo de los atributos geomorfométricos, se reduce la resolución espacial del DEM:
dem2 <- terra::aggregate(dem, fact = 2, fun = "mean")
## |---------|---------|---------|---------|=========================================
dem2
## class : SpatRaster
## size : 1792, 2560, 1 (nrow, ncol, nlyr)
## resolution : 0.001373237, 0.001373237 (x, y)
## extent : -77.34375, -73.82826, -0.7033042, 1.757537 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : elev_Putumayo_z10
## min value : -146
## max value : 4170.75
Se carga nuevamente la capa vectorial de municipios del Putumayo:
munic <- sf::st_read(".\\municipios.gpkg")
## Reading layer `municipiois' from data source
## `C:\Users\ASUS\OneDrive\Documents\unal\GB2\proyecto 4\municipios.gpkg'
## using driver `GPKG'
## Simple feature collection with 12 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -77.1605 ymin: -0.581019 xmax: -73.88365 ymax: 1.427201
## Geodetic CRS: WGS 84
munic <- sf::st_read("./municipios.gpkg", layer = "municipiois")
## Reading layer `municipiois' from data source
## `C:\Users\ASUS\OneDrive\Documents\unal\GB2\proyecto 4\municipios.gpkg'
## using driver `GPKG'
## Simple feature collection with 12 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -77.1605 ymin: -0.581019 xmax: -73.88365 ymax: 1.427201
## Geodetic CRS: WGS 84
munic
## Simple feature collection with 12 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -77.1605 ymin: -0.581019 xmax: -73.88365 ymax: 1.427201
## Geodetic CRS: WGS 84
## First 10 features:
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 TYPE_2
## 1 53 COL Colombia 23 Putumayo 814 Colón Municipio
## 2 53 COL Colombia 23 Putumayo 815 Orito Municipio
## 3 53 COL Colombia 23 Putumayo 816 Puerto Asís Municipio
## 4 53 COL Colombia 23 Putumayo 817 Puerto Caicedo Municipio
## 5 53 COL Colombia 23 Putumayo 818 Puerto Guzmán Municipio
## 6 53 COL Colombia 23 Putumayo 819 Puerto Leguízamo Municipio
## 7 53 COL Colombia 23 Putumayo 820 San Francisco Municipio
## 8 53 COL Colombia 23 Putumayo 821 San Miguel de Mocoa Municipio
## 9 53 COL Colombia 23 Putumayo 822 Santiago Municipio
## 10 53 COL Colombia 23 Putumayo 823 Sibundoy Municipio
## ENGTYPE_2 NL_NAME_2 VARNAME_2 geom
## 1 Municipality <NA> <NA> MULTIPOLYGON (((-77.015 1.2...
## 2 Municipality <NA> <NA> MULTIPOLYGON (((-76.735 0.6...
## 3 Municipality <NA> <NA> MULTIPOLYGON (((-76.11011 0...
## 4 Municipality <NA> <NA> MULTIPOLYGON (((-76.3974 0....
## 5 Municipality <NA> <NA> MULTIPOLYGON (((-76.3974 0....
## 6 Municipality <NA> <NA> MULTIPOLYGON (((-73.88365 -...
## 7 Municipality <NA> <NA> MULTIPOLYGON (((-76.8179 1....
## 8 Municipality <NA> Mocoa MULTIPOLYGON (((-76.4896 0....
## 9 Municipality <NA> <NA> MULTIPOLYGON (((-77.1147 1....
## 10 Municipality <NA> <NA> MULTIPOLYGON (((-77.015 1.2...
Tanto el DEM como la capa de municipios se encuentran en coordenadas geográficas. Finalmente, se recorta el DEM utilizando los límites del departamento:
dem3 <- terra::crop(dem2, munic, mask = TRUE)
El cálculo de atributos geomorfométricos requiere que el DEM esté en coordenadas planas, ya que la pendiente y la orientación se calculan a partir de diferencias de elevación entre celdas vecinas expresadas en una unidad de distancia constante (metros). Desde 2020, el IGAC estableció como sistema oficial de coordenadas planas para Colombia el MAGNA-SIRGAS / Origen-Nacional, identificado con el código EPSG:9377.
Se transforma el DEM a este sistema de coordenadas:
dem_plano <- terra::project(dem3, "EPSG:9377")
dem_plano
## class : SpatRaster
## size : 1457, 2392, 1 (nrow, ncol, nlyr)
## resolution : 152.6287, 152.6287 (x, y)
## extent : 4536748, 4901836, 1493707, 1716087 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : elev_Putumayo_z10
## min value : 86.506157
## max value : 3890.109131
Y se realiza la misma transformación sobre la capa vectorial de municipios:
munic_plano <- sf::st_transform(munic, "EPSG:9377")
munic_plano
## Simple feature collection with 12 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 4536843 ymin: 1493836 xmax: 4901710 ymax: 1716064
## Projected CRS: MAGNA-SIRGAS 2018 / Origen-Nacional
## First 10 features:
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 TYPE_2
## 1 53 COL Colombia 23 Putumayo 814 Colón Municipio
## 2 53 COL Colombia 23 Putumayo 815 Orito Municipio
## 3 53 COL Colombia 23 Putumayo 816 Puerto Asís Municipio
## 4 53 COL Colombia 23 Putumayo 817 Puerto Caicedo Municipio
## 5 53 COL Colombia 23 Putumayo 818 Puerto Guzmán Municipio
## 6 53 COL Colombia 23 Putumayo 819 Puerto Leguízamo Municipio
## 7 53 COL Colombia 23 Putumayo 820 San Francisco Municipio
## 8 53 COL Colombia 23 Putumayo 821 San Miguel de Mocoa Municipio
## 9 53 COL Colombia 23 Putumayo 822 Santiago Municipio
## 10 53 COL Colombia 23 Putumayo 823 Sibundoy Municipio
## ENGTYPE_2 NL_NAME_2 VARNAME_2 geom
## 1 Municipality <NA> <NA> MULTIPOLYGON (((4553144 169...
## 2 Municipality <NA> <NA> MULTIPOLYGON (((4584281 162...
## 3 Municipality <NA> <NA> MULTIPOLYGON (((4653897 159...
## 4 Municipality <NA> <NA> MULTIPOLYGON (((4621922 165...
## 5 Municipality <NA> <NA> MULTIPOLYGON (((4621922 165...
## 6 Municipality <NA> <NA> MULTIPOLYGON (((4901710 151...
## 7 Municipality <NA> <NA> MULTIPOLYGON (((4575124 170...
## 8 Municipality <NA> Mocoa MULTIPOLYGON (((4611648 164...
## 9 Municipality <NA> <NA> MULTIPOLYGON (((4542016 168...
## 10 Municipality <NA> <NA> MULTIPOLYGON (((4553144 169...
Se calcula la pendiente y la orientación del terreno mediante la
función SlpAsp(). El argumento w = c(3, 3)
define una ventana móvil de 3 × 3 celdas alrededor de cada celda
central, es decir, la pendiente y la orientación de cada punto se
calculan a partir de sus 8 celdas vecinas inmediatas. El argumento
method = "queen" indica que se consideran como vecinas
tanto las celdas contiguas en horizontal y vertical como las diagonales
(por analogía con el movimiento de la reina en el ajedrez).
slp_asp <- MultiscaleDTM::SlpAsp(
dem_plano,
w = c(3, 3),
unit = "degrees",
method = "queen",
metrics = c("slope", "aspect"),
na.rm = TRUE,
include_scale = FALSE,
mask_aspect = TRUE
)
slp_asp
## class : SpatRaster
## size : 1457, 2392, 2 (nrow, ncol, nlyr)
## resolution : 152.6287, 152.6287 (x, y)
## extent : 4536748, 4901836, 1493707, 1716087 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## names : slope, aspect
## min values : 0.000866, 0.000282
## max values : 55.265234, 359.999937
El resultado es un objeto SpatRaster con dos capas:
slope y aspect, ambas expresadas en grados. Se
separan a continuación en dos objetos independientes:
slope <- terra::subset(slp_asp, 1)
slope
## class : SpatRaster
## size : 1457, 2392, 1 (nrow, ncol, nlyr)
## resolution : 152.6287, 152.6287 (x, y)
## extent : 4536748, 4901836, 1493707, 1716087 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.000866
## max value : 55.265234
terra::hist(slope,
main = "Pendiente del terreno en Putumayo",
xlab = "Pendiente (en grados)")
## Warning: [hist] a sample of 29% of the cells was used (of which 70% was NA)
aspect <- terra::subset(slp_asp, 2)
aspect
## class : SpatRaster
## size : 1457, 2392, 1 (nrow, ncol, nlyr)
## resolution : 152.6287, 152.6287 (x, y)
## extent : 4536748, 4901836, 1493707, 1716087 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : aspect
## min value : 0.000282
## max value : 359.999937
terra::hist(aspect,
main = "Orientación del terreno en Putumayo",
xlab = "Orientación (en grados)")
## Warning: [hist] a sample of 29% of the cells was used (of which 70% was NA)
Adicionalmente, se convierte la pendiente de grados a porcentaje, unidad ampliamente utilizada en estudios de suelos y aptitud agrícola:
slope_perc <- tan(slope * (pi / 180)) * 100
terra::hist(slope_perc,
main = "Pendiente del terreno en Putumayo",
xlab = "Pendiente (en porcentaje)")
## Warning: [hist] a sample of 29% of the cells was used (of which 70% was NA)
Una operación de estadísticas zonales calcula estadísticas de un raster de valores (en este caso, la pendiente) dentro de las zonas definidas por otra capa (en este caso, los municipios). Se calcula la pendiente promedio por municipio.
Primero, se reclasifica la pendiente en porcentaje según las clases de pendiente del IGAC utilizadas con fines agrológicos:
m <- c(0, 3, 1,
3, 7, 2,
7, 12, 3,
12, 25, 4,
25, 50, 5,
50, 75, 6,
75, 160, 7)
m <- matrix(m, ncol = 3, byrow = TRUE)
rc <- terra::classify(slope_perc, m, right = TRUE)
Se calcula la pendiente media por municipio:
munic_plano$mean_slope <- exactextractr::exact_extract(slope_perc, munic_plano, "mean")
## | | | 0% | |====== | 8% | |============ | 17% | |================== | 25% | |======================= | 33% | |============================= | 42% | |=================================== | 50% | |========================================= | 58% | |=============================================== | 67% | |==================================================== | 75% | |========================================================== | 83% | |================================================================ | 92% | |======================================================================| 100%
hist(munic_plano$mean_slope,
main = "Pendiente media por municipio - Putumayo",
xlab = "Pendiente (en porcentaje)")
Y la clase de pendiente predominante (moda) por municipio:
munic_plano$class <- exactextractr::exact_extract(rc, munic_plano, "mode")
## | | | 0% | |====== | 8% | |============ | 17% | |================== | 25% | |======================= | 33% | |============================= | 42% | |=================================== | 50% | |========================================= | 58% | |=============================================== | 67% | |==================================================== | 75% | |========================================================== | 83% | |================================================================ | 92% | |======================================================================| 100%
hist(munic_plano$class,
main = "Clase de pendiente predominante - Putumayo",
xlab = "Clase de pendiente (IGAC)")
Finalmente, se transforman de vuelta a coordenadas geográficas la pendiente reclasificada y la pendiente en porcentaje, para poder representarlas sobre un mapa base de OpenStreetMap:
rc_geo <- terra::project(rc, "EPSG:4326")
slope_geo <- terra::project(slope_perc, "EPSG:4326")
slope_deg_geo <- terra::project(slope, "EPSG:4326")
aspect_geo <- terra::project(aspect, "EPSG:4326")
munic_geo <- sf::st_transform(munic_plano, "EPSG:4326")
Se define una paleta de colores continua para representar la pendiente en porcentaje:
pal_slope <- leaflet::colorNumeric(
c("darkseagreen3", "yellow2", "orange", "brown2", "darkred"),
values(slope_geo),
na.color = "transparent"
)
leaflet(munic_geo) %>%
addTiles() %>%
setView(-76.5, 0.5, 8) %>%
addPolygons(
color = "gray", weight = 1.0, smoothFactor = 0.5,
opacity = 0.4, fillOpacity = 0.10,
popup = paste("Municipio: ", munic_geo$NAME_2, "<br>",
"Clase de pendiente: ", munic_geo$class, "<br>")) %>%
addRasterImage(slope_geo, colors = pal_slope, opacity = 0.8) %>%
addLegend(pal = pal_slope, values = values(slope_geo),
title = "Pendiente del terreno en Putumayo (%)")
El mapa permite identificar, al hacer clic sobre cada municipio, su nombre y la clase de pendiente predominante según la clasificación agrológica del IGAC.
A continuación se presenta una segunda visualización de la pendiente, esta vez expresada en grados, incorporando además etiquetas con el nombre de cada municipio y su pendiente media. Se conservan las mismas ventanas emergentes (popups) utilizadas en el mapa anterior.
Para ubicar las etiquetas se calculan los centroides de los municipios, de forma análoga al cuaderno del DEM:
centers <- sf::st_centroid(munic_plano)
## Warning: st_centroid assumes attributes are constant over geometries
centers <- sf::st_transform(centers, "EPSG:4326")
centers$x <- sf::st_coordinates(centers)[, 1]
centers$y <- sf::st_coordinates(centers)[, 2]
pal_slope_deg <- leaflet::colorNumeric(
c("darkseagreen3", "yellow2", "orange", "brown2", "darkred"),
values(slope_deg_geo),
na.color = "transparent"
)
leaflet(munic_geo) %>%
addTiles() %>%
setView(-76.5, 0.5, 8) %>%
addPolygons(
color = "gray", weight = 1.0, smoothFactor = 0.5,
opacity = 0.4, fillOpacity = 0.10,
popup = paste("Municipio: ", munic_plano$NAME_2, "<br>",
"Clase de pendiente: ", munic_plano$class, "<br>")) %>%
addLabelOnlyMarkers(
data = centers,
lng = ~x, lat = ~y,
label = ~paste0(NAME_2, ": ", round(mean_slope, 1), "%"),
labelOptions = labelOptions(noHide = TRUE, direction = "top", textOnly = TRUE)) %>%
addRasterImage(slope_deg_geo, colors = pal_slope_deg, opacity = 0.8) %>%
addLegend(pal = pal_slope_deg, values = values(slope_deg_geo),
title = "Pendiente del terreno en Putumayo (grados)")
A diferencia del mapa anterior, esta visualización muestra la pendiente en su unidad original (grados) y agrega directamente sobre el mapa el nombre de cada municipio junto con su pendiente media en porcentaje, lo que facilita comparar visualmente los municipios más planos con los de relieve más pronunciado sin necesidad de hacer clic sobre cada polígono.
La orientación (aspect) es una variable circular: sus valores van de 0° a 360° y representan una dirección cardinal (0°/360° = norte, 90° = este, 180° = sur, 270° = oeste). Por esta razón, a diferencia de la pendiente, no es adecuado usar una paleta secuencial de un solo extremo de color a otro, sino una paleta cíclica en la que el color inicial y el final coincidan.
pal_aspect <- leaflet::colorNumeric(
palette = c("red", "yellow", "green", "cyan", "blue", "magenta", "red"),
domain = c(0, 360),
na.color = "transparent"
)
leaflet(munic_geo) %>%
addTiles() %>%
setView(-76.5, 0.5, 8) %>%
addPolygons(
color = "gray", weight = 1.0, smoothFactor = 0.5,
opacity = 0.4, fillOpacity = 0.10,
popup = paste("Municipio: ", munic_plano$NAME_2, "<br>")) %>%
addRasterImage(aspect_geo, colors = pal_aspect, opacity = 0.8) %>%
addLegend(pal = pal_aspect, values = c(0, 90, 180, 270, 360),
title = "Orientación del terreno en Putumayo (grados)")
El mapa evidencia que la orientación del terreno cambia de forma abrupta entre celdas vecinas incluso en zonas de pendiente suave, ya que ángulos cercanos como 359° y 1° son en realidad casi idénticos en dirección, pero numéricamente muy distantes. Esta es la razón por la cual se utilizó una paleta cíclica: con una paleta secuencial normal, laderas que miran prácticamente hacia el mismo lugar aparecerían con colores opuestos.
La pendiente del terreno en el Putumayo muestra una variación considerable entre municipios, coherente con la transición geográfica del departamento entre el piedemonte andino-amazónico y las tierras bajas de la llanura amazónica. Los municipios ubicados hacia el occidente del departamento, más cercanos a la cordillera, presentan en general pendientes medias más altas que los municipios de las tierras bajas hacia el oriente.
La orientación del terreno resulta más heterogénea que la pendiente dentro de un mismo municipio, ya que depende directamente de la microtopografía local (valles, laderas y drenajes), mientras que la pendiente tiende a variar de forma más gradual a lo largo del territorio.
El flujo de trabajo desarrollado permitió calcular atributos
geomorfométricos multiescala a partir de un DEM previamente obtenido
para el departamento del Putumayo, empleando el paquete
MultiscaleDTM. La necesidad de trabajar en coordenadas
planas (EPSG:9377) para este tipo de cálculos, y de reclasificar la
pendiente según categorías agrológicas oficiales (IGAC), ilustra la
importancia de conocer tanto el sistema de referencia de coordenadas
como el propósito de aplicación de la información al construir un flujo
de análisis geoespacial reproducible.
MultiscaleDTM.exactextractr, empleando la clasificación agrológica del
IGAC.leaflet:
uno de pendiente en porcentaje con clase por municipio, uno de pendiente
en grados con etiquetas de pendiente media por municipio, y uno de
orientación del terreno con una paleta de colores cíclica.Lizarazo, I., 2025. Geomorphometric terrain attributes in R. Universidad Nacional de Colombia.
Lizarazo, I., 2025. Elevation data processing and analysis in R. Available at https://rpubs.com/ials2un/otro_dem
sessionInfo()
## R version 4.6.0 (2026-04-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8 LC_CTYPE=Spanish_Colombia.utf8
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Colombia.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] exactextractr_0.10.1 MultiscaleDTM_1.0.1 leaflet_2.2.3
## [4] terra_1.9-27 sf_1.1-1
##
## loaded via a namespace (and not attached):
## [1] sass_0.4.10 generics_0.1.4 class_7.3-23 KernSmooth_2.23-26
## [5] lattice_0.22-9 digest_0.6.39 magrittr_2.0.5 rgl_1.3.36
## [9] RColorBrewer_1.1-3 evaluate_1.0.5 grid_4.6.0 fastmap_1.2.0
## [13] jsonlite_2.0.0 e1071_1.7-17 DBI_1.3.0 promises_1.5.0
## [17] scales_1.4.0 crosstalk_1.2.2 codetools_0.2-20 jquerylib_0.1.4
## [21] cli_3.6.6 shiny_1.14.0 rlang_1.2.0 units_1.0-1
## [25] base64enc_0.1-6 cachem_1.1.0 yaml_2.3.12 otel_0.2.0
## [29] tools_4.6.0 raster_3.6-32 dplyr_1.2.1 httpuv_1.6.17
## [33] png_0.1-9 vctrs_0.7.3 R6_2.6.1 mime_0.13
## [37] proxy_0.4-29 lifecycle_1.0.5 classInt_0.4-11 htmlwidgets_1.6.4
## [41] pkgconfig_2.0.3 bslib_0.10.0 pillar_1.11.1 later_1.4.8
## [45] glue_1.8.1 Rcpp_1.1.1-1.1 xfun_0.57 tibble_3.3.1
## [49] tidyselect_1.2.1 rstudioapi_0.18.0 knitr_1.51 farver_2.1.2
## [53] xtable_1.8-8 htmltools_0.5.9 rmarkdown_2.31 compiler_4.6.0
## [57] sp_2.2-1