Contenido
Enlace Código en RPubs: Tarea 5: RPubs
# Cargar Paquetes a utilizar
library(knitr)
library(purrr)
library(gt)
library(DT)
Primer Ejercicio
- Haga un bucle for que una todos los datos contenidos en los archivos de texto en un solo cuadro de datos (‘data frame’, debe llamarse ‘datos_camaras’) y añada una columna con el nombre del archivo de donde provienen los datos (debe llamarse ‘archivo’; pistas: 1) añadir el nombre del archivo en una columna se hace en el cuerpo del bucle luego de leer el archivo; 2) recuerden usar basename()).
Llamar bases de datos
# Asignación de nombre al directorio
directorio <- "../data/raw/MaxN"
# hacer vector con nombre y direccion de archivos
archivos <-
list.files(
path = directorio,
full.names = TRUE, # Puede brindar la ruta de direccion donde se encuentra
pattern = "TXT$" #busca solo archivos que sea txt y ese txt esté hasta le final (formato o extensión del archivo)
)
head(archivos)
## [1] "../data/raw/MaxN/2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT"
## [2] "../data/raw/MaxN/2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [3] "../data/raw/MaxN/2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT"
## [4] "../data/raw/MaxN/2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT"
## [5] "../data/raw/MaxN/2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT"
## [6] "../data/raw/MaxN/2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT"
Desarrollo del bucle “for”
datos_camaras <- NULL # Fijar vector vacío
# Inicio del bucle for; se designa de qué conjunto de datos tomará los valores (i; en este ejemplo de las bases de datos denominadas "archivos")
for (i in archivos) {
# linea de código que nos ayuda a leer los datos contenidos en las bases "archivos"
dtxt <- read.table(i, header = T, sep = "\t", fill = TRUE, skip = 4)
# línea de código para agregar la nueva columna ("archivo") con los nombres de la extensión o archivo del cual provienen
datos <- data.frame(archivo = basename(i), dtxt)
# guardar los resultados en el vector vacio del inicio
datos_camaras <- rbind(datos_camaras, datos)
}
Visualicación de datos
# Visualización de la tabla de datos: datos_camaras
head(datos_camaras, 10) |>
gt() |>
tab_options(table.background.color = "#1C1C1C")
| archivo | Filename | Frame | Time..mins. | Period | Period.time..mins. | OpCode | TapeReader | Depth | Comment | Date | Site | BRUVS.NO | TimeIN | TimeOUT | Bait | Lat | Long | Family | Genus | Species | Code | MaxN | Has.fed |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 11451 | 3.1840 | inicio | 1.5504 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | 1 | No | ||||
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 25005 | 6.9528 | inicio | 5.3192 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Acanthuridae | Acanthurus | xanthopterus | Acaxantho | 3 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH028767_LcamT3.MP4 | 30464 | 24.5201 | inicio | 22.8865 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Acanthuridae | Prionurus | laticlavius | Prilaticl | 11 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 26911 | 7.4828 | inicio | 5.8492 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Balistidae | 1 | No | |||
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH048767_LcamT3.MP4 | 49845 | 62.0078 | inicio | 60.3742 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Balistidae | Balistes | polylepis | Balpolyle | 2 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 13064 | 3.6325 | inicio | 1.9989 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Balistidae | Pseudobalistes | naufragium | Psenaufra | 2 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH028767_LcamT3.MP4 | 18678 | 21.2429 | inicio | 19.6093 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Balistidae | Sufflamen | verres | Sufverres | 1 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 31200 | 8.6753 | inicio | 7.0418 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Blenniidae | Plagiotremus | azaleus | 2 | No | |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH058767_LcamT3.MP4 | 4623 | 65.4829 | inicio | 63.8493 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Carangidae | Caranx | caballus | Carcaball | 3 | No |
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | GH018767_LcamT3.MP4 | 29044 | 8.0758 | inicio | 6.4423 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | Andres | 10 | NA | 2021-09-25 | Pelada1 | R3-LcamT3-RcamN4_Pelada1_2021-09-24 | 10:23 | 11:52 | Yes | 10.87168 | -85.88647 | Carangidae | Elagatis | bipinnulata | Elabipinn | 1 | No |
Segundo Ejercicio
- Haga un bucle sapply que devuelva el número de familias para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser guardado en un cuadro de datos (‘data frame’) que contenga las columnas ‘archivo’ y ‘n_familias’. (pistas: 1) necesitan crear una función en la llamada del bucle; 2) el bucle debe ciclar sobre cada uno de los nombres de archivo; 3) deben crear un subconjunto de los datos para cada archivo a lo interno del bucle). Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig7.png")
Desarrollo del bucle “sapply”
# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
n_familias <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {
# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]
# línea de código para número de familias unicas en cada archivo i
fam <- length(unique(d_camaras$Family))
})
# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dff <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias)
Visualización de datos
gt(dff) |>
tab_options(table.background.color = "#1C1C1C")
| archivo | n_familias |
|---|---|
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | 19 |
| 2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT | 1 |
| 2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT | 2 |
| 2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT | 8 |
| 2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT | 7 |
| 2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT | 5 |
| 2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT | 5 |
| 2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT | 5 |
| 2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT | 20 |
| 2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT | 16 |
| 2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT | 14 |
| 2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT | 7 |
| 2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT | 18 |
| 2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT | 19 |
| 2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT | 15 |
| 2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT | 9 |
| 2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT | 5 |
| 2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT | 6 |
| 2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT | 18 |
Tercer Ejercicio
- Haga un bucle sapply que devuelva el número de géneros (columna ‘genus’) para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser añadido como una nueva columna al cuadro de datos creado en el ejercicio 2. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig8.png")
Desarrollo del bucle “sapply”
# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
n_generos <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {
# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]
# línea de código para número de géneros unicos en cada archivo i
gen <- length(unique(d_camaras$Genus))
})
# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dfg <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias, n_generos)
Visualización de datos
gt(dfg) |>
tab_options(table.background.color = "#1C1C1C")
| archivo | n_familias | n_generos |
|---|---|---|
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | 19 | 32 |
| 2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT | 1 | 1 |
| 2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT | 2 | 2 |
| 2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT | 8 | 11 |
| 2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT | 7 | 11 |
| 2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT | 5 | 8 |
| 2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT | 5 | 9 |
| 2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT | 5 | 8 |
| 2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT | 20 | 25 |
| 2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT | 16 | 30 |
| 2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT | 14 | 20 |
| 2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT | 7 | 11 |
| 2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT | 18 | 20 |
| 2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT | 19 | 24 |
| 2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT | 15 | 27 |
| 2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT | 9 | 17 |
| 2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT | 5 | 7 |
| 2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT | 6 | 10 |
| 2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT | 18 | 24 |
Cuarto Ejercicio
- Haga un bucle sapply que devuelva la fecha de creación del video para cada archivo. El bucle debe usar los datos en el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto). El resultado debe ser añadido como una nueva columna al cuadro de datos creado en el ejercicio 2. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig9.png")
Desarrollo del bucle “sapply”
# inicio del bucle, con lectura unique para cada archivo i en datos_camaras
Fecha <- sapply(X = unique(datos_camaras$archivo), FUN = function(i) {
# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$archivo == i, ]
# línea de código para número de géneros unicos en cada archivo i
date <- length(unique(d_camaras$Date))
})
# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dffch <- data.frame(archivo = basename(unique(datos_camaras$archivo)), n_familias, n_generos, Fecha)
Visualización de datos
gt(dffch) |>
tab_options(table.background.color = "#1C1C1C")
| archivo | n_familias | n_generos | Fecha |
|---|---|---|---|
| 2022-09-02_R3-LcamT3-RcamN4_Pel1_2021-09-24_MaxN.TXT | 19 | 32 | 1 |
| 2022-09-03_S6-LB13-RB12_PuntaMariaOeste_2022-03-24_MaxN.TXT | 1 | 1 | 1 |
| 2022-09-03_T4-LB19-RB18_PuntaMariaOeste_2022-03-24_MaxN.TXT | 2 | 2 | 1 |
| 2022-09-04_S1-LB10-RN9_Arco2_2022-07-15_MaxN.TXT | 8 | 11 | 1 |
| 2022-09-07_P1-LB12-RB13_Gissler_2022-03-30_MaxN.TXT | 7 | 11 | 1 |
| 2022-09-11_P1-LB14-RB13_Risco_2022-03-26_MaxN.TXT | 5 | 8 | 1 |
| 2022-09-12_S6-LN4-RN8_Chatham_2022-03-28_MaxN.TXT | 5 | 9 | 1 |
| 2022-09-14_R2C4_Catalinas1_21-7-2021_MaxN.TXT | 5 | 8 | 1 |
| 2022-09-14_S2C4_Virador1-20-7-2021_MaxN.TXT | 20 | 25 | 1 |
| 2022-09-14_S6-LB7-RB8_Silverado_2022-03-28_MaxN.TXT | 16 | 30 | 1 |
| 2022-09-15_S6-LB9-RB11_Vikinga_2022-03-30_MaxN.TXT | 14 | 20 | 1 |
| 2022-09-15_T4-LcamT8-RcamOFI-5_Barlovento2_2021-10-17_MaxN.TXT | 7 | 11 | 1 |
| 2022-09-16_S2C8_Bajo Rojo1_2021-07-28_MaxN.TXT | 18 | 20 | 1 |
| 2022-09-16_T4-LcamN5-RcamT6_ISJ2_2021-09-25_MaxN.TXT | 19 | 24 | 1 |
| 2022-09-17_SB3-LcamT4-RcamN6_CanalSJ_2021-09-25_MaxN.TXT | 15 | 27 | 1 |
| 2022-09-20_T3C7_Dampier2_2021-10-19_MaxN.TXT | 9 | 17 | 1 |
| 2022-09-22_T4-LN9-RT1_Bautista_2022-03-26_MaxN.TXT | 5 | 7 | 1 |
| 2022-09-24_T4-LcamT3-RcamSN7_Esfinge2_2021-10-17_MaxN.TXT | 6 | 10 | 1 |
| 2022-09-25_T3C2_SJ2_2021-09-25_MaxN.TXT | 18 | 24 | 1 |
Quinto Ejercicio
- Haga un bucle sapply que calcule el número de veces que se observó cada especie. El bucle debe trabajar sobre el data frame ‘datos_camaras’ creado en el ejercicio 1 (no debe leer de nuevo los archivos de texto) y el cálculo debe ser la suma de la columna ‘MaxN’. Ponga los resultados en un cuadro de datos con columnas para especie y número de observaciones. (pista: unique(datos_camaras$Species)). Remueva el campo en el que especie es igual a ““. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig11.png")
Desarrollo del bucle “sapply”
spp <- unique(datos_camaras$Species)[-1] # Línea de código que me ayuda a generar el listado unico de especies de la base de datos, se omite [-1] el primer valor denominado ("")
n_obs <- sapply(X = spp, FUN = function(i) { #observaciones en relacion a las especies
# línea de código para generar un subconjunto de datos para cada archivo i
d_camaras <- datos_camaras[datos_camaras$Species == i, ]
# línea de código para número de especies unicas en cada archivo i
especies <- (unique(d_camaras$Species))
# Línea de código para el cálculo del número de veces que se observó la spp
obs <- sum(d_camaras$MaxN)
})
# línea de código para generar el data frame resumen con nombre de archivos y número de familias
dfsp <- data.frame(spp, n_obs)
Visualización de datos
datatable(dfsp) |> formatStyle(
'spp',
backgroundColor = "#B2F2FF")
Sexto Ejercicio
- Utilice bucles sapply para añadir el mínimo y máximo de la profundidad para cada una de las especies en el cuadro de datos creado en el ejercicio anterior (pistas: 1) asegúrese que la columna de profundidad es numérica antes de calcular las profundidades; 2) gsub(” m”, ““, vector); 3) gsub(”,“,”.”, vector); 4) as.numeric()). Las primeras 3 filas del cuadro de datos deben verse así:
Desarrollo del bucle “sapply”
# Profundidad máxima
datos_camaras[9] <- map_df(datos_camaras[9], ~ gsub(" m", "", .x)) #solucionar errores que se encuentran en la base original, de escritura por ejemplo (valores con letras, o signos diferentes, tal como: comas o puntos en el caso de los decimales)
datos_camaras[9] <- map_df(datos_camaras[9], ~ gsub(",", ".", .x))
# Transforma a variable numerica la profundidad
datos_camaras$Depth <- as.numeric(datos_camaras$Depth)
max_prof <- sapply(X = spp, FUN = function(i) {
d_camaras <- datos_camaras[datos_camaras$Species == i, ] # # línea de código para generar un subconjunto de datos para cada archivo i
maxi_prof <- max(d_camaras$Depth) # profundida mínima a la que se encontró (i) especie
})
# Profundidad mínima
min_prof <- sapply(X = spp, FUN = function(i) {
d_camaras <- datos_camaras[datos_camaras$Species == i, ] # línea de código para generar un subconjunto de datos para cada archivo i
mini_prof <- min(d_camaras$Depth) # profundida mínima a la que se encontró (i) especie
})
dfmin <- data.frame(spp, n_obs, min_prof, max_prof)
Visualización de datos
datatable(dfmin)
Séptimo Ejercicio
- Calcule el rango de profundidad (i.e. la diferencia entre el mínimo y el máximo de la profundidad) para cada especie y añádalo como una columna al cuadro de datos creado en el ejercicio 5. Las primeras 3 filas del cuadro de datos deben verse así:
include_graphics("../Images/Fig12.png")
Desarrollo del bucle “sapply”
datos_camaras$Depth <- as.numeric(datos_camaras$Depth) # Nota para mi: Recordar verificar que las variables se encuentren definidas correctamentamente, tal como: numericas, factores.
rango <- sapply(X = spp, FUN = function(i) {
d_camaras <- datos_camaras[datos_camaras$Species == i, ] # línea de código para generar un subconjunto de datos para cada archivo i
ran <- abs(max(datos_camaras$Depth) - min(datos_camaras$Depth)) # línea de código para calcular el rango de profundidad a la que se encontró cada especie
})
dft <- data.frame(spp, n_obs, min_prof, max_prof, rango) # se agrega el nuevo resultado "rango" al df de base
Octavo Ejercicio
datatable(dft)
## R version 4.1.3 (2022-03-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 22621)
##
## Matrix products: default
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] DT_0.30 gt_0.10.0 purrr_1.0.1 knitr_1.44
##
## loaded via a namespace (and not attached):
## [1] rstudioapi_0.15.0 xml2_1.3.3 magrittr_2.0.3 tidyselect_1.2.0
## [5] R6_2.5.1 rlang_1.1.0 fastmap_1.1.1 fansi_1.0.4
## [9] dplyr_1.1.2 tools_4.1.3 xfun_0.39 utf8_1.2.3
## [13] cli_3.6.1 withr_2.5.1 jquerylib_0.1.4 ellipsis_0.3.2
## [17] crosstalk_1.2.0 htmltools_0.5.5 yaml_2.3.7 digest_0.6.31
## [21] tibble_3.2.1 lifecycle_1.0.3 bookdown_0.35 htmlwidgets_1.6.2
## [25] sass_0.4.5 vctrs_0.6.1 glue_1.6.2 cachem_1.0.7
## [29] evaluate_0.22 rmarkdown_2.25 compiler_4.1.3 bslib_0.5.1
## [33] pillar_1.9.0 generics_0.1.3 rmdformats_1.0.4 jsonlite_1.8.4
## [37] pkgconfig_2.0.3