45 Interacciones con directorios
En esta página cubrimos los escenarios comunes en los que se crea, se interactúa, se guarda y se importa con directorios (carpetas).
45.1 Preparación
Paquete fs
El paquete fs es un paquete tidyverse que facilita las interacciones con los directorios, mejorando algunas de las funciones de R base. En las secciones siguientes utilizaremos a menudo funciones de fs.
pacman::p_load(
fs, # interacciones archivo/directorio
rio, # importación/exportación
here, # rutas relativas de archivos
tidyverse) # gestión y visualización de datos
Imprimir el directorio como un árbol de dendrogramas
Utiliza la función dir_tree()
de fs.
Proporciona la ruta de la carpeta a path =
y decide si quieres mostrar sólo un nivel (recurse = FALSE
) o todos los archivos en todos los subniveles (recurse = TRUE
). A continuación utilizamos here()
como abreviatura del proyecto R y especificamos su subcarpeta “data”, que contiene todos los datos utilizados para este manual de R. Lo configuramos para que muestre todos los archivos dentro de “data” y sus subcarpetas (por ejemplo, “cache”, “epidemic models”, “population”, “shp” y “weather”).
## /home/peron/R/GitHub/epiRhandbook_es/data
## ├── cache
## │ └── epidemic_models
## │ ├── 2015-04-30
## │ │ ├── estimate_samples.rds
## │ │ ├── estimated_reported_cases_samples.rds
## │ │ ├── latest_date.rds
## │ │ ├── reported_cases.rds
## │ │ ├── summarised_estimated_reported_cases.rds
## │ │ ├── summarised_estimates.rds
## │ │ └── summary.rds
## │ ├── epinow_res.rds
## │ ├── epinow_res_small.rds
## │ ├── generation_time.rds
## │ └── incubation_period.rds
## ├── case_linelists
## │ ├── cleaning_dict.csv
## │ ├── fluH7N9_China_2013.csv
## │ ├── linelist_cleaned.rds
## │ └── linelist_raw.xlsx
## ├── example
## │ ├── Central Hospital.csv
## │ ├── Military Hospital.csv
## │ ├── Missing.csv
## │ ├── Other.csv
## │ ├── Port Hospital.csv
## │ ├── St. Mark's Maternity Hospital (SMMH).csv
## │ ├── district_weekly_count_data.xlsx
## │ ├── fluH7N9_China_2013.csv
## │ ├── hospital_linelists.xlsx
## │ └── linelists
## │ ├── 20201007linelist.csv
## │ ├── case_linelist20201006.csv
## │ ├── case_linelist_2020-10-02.csv
## │ ├── case_linelist_2020-10-03.csv
## │ ├── case_linelist_2020-10-04.csv
## │ ├── case_linelist_2020-10-05.csv
## │ └── case_linelist_2020-10-08.xlsx
## ├── flexdashboard
## │ ├── outbreak_dashboard.Rmd
## │ ├── outbreak_dashboard.html
## │ ├── outbreak_dashboard_shiny.Rmd
## │ ├── outbreak_dashboard_test.Rmd
## │ └── outbreak_dashboard_test.html
## ├── gis
## │ ├── africa_countries.geo.json
## │ ├── covid_incidence.csv
## │ ├── covid_incidence_map.R
## │ ├── linelist_cleaned_with_adm3.rds
## │ ├── population
## │ │ ├── sle_admpop_adm3_2020.csv
## │ │ └── sle_population_statistics_sierraleone_2020.xlsx
## │ └── shp
## │ ├── README.txt
## │ ├── sle_adm3.CPG
## │ ├── sle_adm3.dbf
## │ ├── sle_adm3.prj
## │ ├── sle_adm3.sbn
## │ ├── sle_adm3.sbx
## │ ├── sle_adm3.shp
## │ ├── sle_adm3.shp.xml
## │ ├── sle_adm3.shx
## │ ├── sle_hf.CPG
## │ ├── sle_hf.dbf
## │ ├── sle_hf.prj
## │ ├── sle_hf.sbn
## │ ├── sle_hf.sbx
## │ ├── sle_hf.shp
## │ └── sle_hf.shx
## ├── godata
## │ ├── cases_clean.rds
## │ ├── contacts_clean.rds
## │ ├── followups_clean.rds
## │ └── relationships_clean.rds
## ├── likert_data.csv
## ├── linelist_cleaned.xlsx
## ├── make_evd_dataset.R
## ├── malaria_app
## │ ├── app.R
## │ ├── data
## │ │ └── facility_count_data.rds
## │ ├── funcs
## │ │ └── plot_epicurve.R
## │ ├── global.R
## │ ├── malaria_app.Rproj
## │ ├── server.R
## │ └── ui.R
## ├── malaria_facility_count_data.rds
## ├── phylo
## │ ├── Shigella_subtree_2.nwk
## │ ├── Shigella_subtree_2.txt
## │ ├── Shigella_tree.txt
## │ └── sample_data_Shigella_tree.csv
## ├── rmarkdown
## │ ├── outbreak_report.Rmd
## │ ├── outbreak_report.docx
## │ ├── outbreak_report.html
## │ ├── outbreak_report.pdf
## │ ├── outbreak_report.pptx
## │ ├── report_tabbed_example.Rmd
## │ └── report_tabbed_example.html
## ├── standardization
## │ ├── country_demographics.csv
## │ ├── country_demographics_2.csv
## │ ├── deaths_countryA.csv
## │ ├── deaths_countryB.csv
## │ └── world_standard_population_by_sex.csv
## ├── surveys
## │ ├── population.xlsx
## │ ├── survey_data.xlsx
## │ └── survey_dict.xlsx
## └── time_series
## ├── campylobacter_germany.xlsx
## └── weather
## ├── germany_weather2002.nc
## ├── germany_weather2003.nc
## ├── germany_weather2004.nc
## ├── germany_weather2005.nc
## ├── germany_weather2006.nc
## ├── germany_weather2007.nc
## ├── germany_weather2008.nc
## ├── germany_weather2009.nc
## ├── germany_weather2010.nc
## └── germany_weather2011.nc
45.2 Listar los archivos de un directorio
Para listar sólo los nombres de los archivos de un directorio puedes utilizar dir()
de R base. Por ejemplo, este comando lista los nombres de los archivos de la subcarpeta “population” de la carpeta “data” en un proyecto R. La ruta relativa de los archivos se proporciona utilizando here()
(sobre la que puede leer más en la página de importación y exportación).
## [1] "sle_admpop_adm3_2020.csv" "sle_population_statistics_sierraleone_2020.xlsx"
Para listar las rutas completas de los archivos del directorio, puedes utilizar dir_ls()
de fs. Una alternativa de R base es list.files()
.
# rutas de archivos
dir_ls(here("data", "gis", "population"))
## /home/peron/R/GitHub/epiRhandbook_es/data/gis/population/sle_admpop_adm3_2020.csv /home/peron/R/GitHub/epiRhandbook_es/data/gis/population/sle_population_statistics_sierraleone_2020.xlsx
Para obtener toda la información de los metadatos de cada archivo en un directorio, (por ejemplo, la ruta, la fecha de modificación, etc.) puedes utilizar dir_info()
de fs.
Esto puede ser especialmente útil si quieres extraer la última hora de modificación del archivo, por ejemplo si quieres importar la versión más reciente de un archivo. Para ver un ejemplo de esto, consulta la página de importación y exportación.
# información de archivo
dir_info(here("data", "gis", "population"))
Aquí está el dataframe devuelto. Desplázate a la derecha para ver todas las columnas.
45.3 Información sobre el archivo
Para extraer información de metadatos sobre un archivo específico, puedes utilizar file_info()
de fs (o file.info()
de R base).
file_info(here("data", "case_linelists", "linelist_cleaned.rds"))
Aquí usamos $
para indexar el resultado y devolver sólo el valor de modification_time
.
file_info(here("data", "case_linelists", "linelist_cleaned.rds"))$modification_time
## [1] "2023-01-09 21:23:59 CET"
45.4 Comprobar si existe
Objetos R
Puedes utilizar exists()
de R base para comprobar si un objeto R existe dentro de R (escribe el nombre del objeto entre comillas).
exists("linelist")
## [1] TRUE
Ten en cuenta que algunos paquetes de R base utilizan nombres de objetos genéricos como “data” entre bastidores, que aparecerán como TRUE a menos que se especifique inherit = FALSE
. Esta es una razón para no nombrar tu conjunto de datos como “data”.
exists("data")
## [1] TRUE
exists("data", inherit = FALSE)
## [1] FALSE
Si estás escribiendo una función, deberías utilizar missing()
de R base para comprobar si un argumento está presente o no, en lugar de exists()
.
Directorios
Para comprobar si un directorio existe, escribe la ruta del archivo (y el nombre del archivo) a is_dir()
de fs. Desplázate a la derecha para ver que se imprime TRUE
.
is_dir(here("data"))
## /home/peron/R/GitHub/epiRhandbook_es/data
## TRUE
Una alternativa de R base es file.exists()
.
Files
Para comprobar si un archivo específico existe, utiliza is_file()
de fs. Desplázate a la derecha para ver que se imprime TRUE
.
is_file(here("data", "case_linelists", "linelist_cleaned.rds"))
## /home/peron/R/GitHub/epiRhandbook_es/data/case_linelists/linelist_cleaned.rds
## TRUE
Una alternativa de R base es file.exists()
.
45.5 Crear
Directorios
Para crear un nuevo directorio (carpeta) puede utilizar dir_create()
de fs. Si el directorio ya existe, no se sobrescribirá y no se devolverá ningún error.
dir_create(here("data", "test"))
Una alternativa es dir.create()
de R base, que mostrará un error si el directorio ya existe. En cambio, dir_create()
en este escenario será silencioso.
Archivos
Puedes crear un archivo (vacío) con file_create()
de fs. Si el archivo ya existe, no se sobreescribirá ni se modificará.
file_create(here("data", "test.rds"))
Una alternativa de R base es file.create()
. Pero si el archivo ya existe, esta opción lo truncará. Si se utiliza file_create()
el archivo se dejará sin cambios
45.6 Borrar
Objetos R
Utiliza rm()
de R base para eliminar un objeto R.
45.7 Ejecución de otros archivos
source()
Para ejecutar un script de R desde otro script de R, puedes utilizar el comando source()
(de R base).
Esto equivale a ver el script de R anterior y clicar en el botón “Source” en la parte superior derecha del script. Esto ejecutará el script pero lo hará de forma silenciosa (sin salida a la consola de R) a menos que se pretenda específicamente. Consulta la página sobre [Consola interactiva] para ver ejemplos de uso de source()
para interactuar con un usuario a través de la consola de R en modo de pregunta y respuesta.
render()
render()
es una variación de source()
que se utiliza más a menudo para los scripts de R markdown. Tu pescribes input =
que es el archivo R markdown, y también output_format =
(“html_document”, “pdf_document”, “word_document”, ““)
Mira la página sobre Informes con R Markdown para más detalles. También consulta la documentación de render()
aquí o escribiendo ?render
.
Ejecutar archivos en un directorio
Puedes crear un bucle for y utilizarlo para source()
cada archivo en un directorio, identificado con dir()
.
for(script in dir(here("scripts"), pattern = ".R$")) { # para cada nombre de script en la carpeta "scripts" del proyecto R (con extensión .R)
source(here("scripts", script)) # obtiene el archivo con el nombre correspondiente que existe en la carpeta scripts
}
Si sólo quieres ejecutar determinados scripts, puedes identificarlos por su nombre de la siguiente manera:
scripts_to_run <- c(
"epicurves.R",
"demographic_tables.R",
"survival_curves.R"
)
for(script in scripts_to_run) {
source(here("scripts", script))
}
Aquí puedes ver una comparación de las funciones fs y R base.
Importar archivos en un directorio
Consulta la página sobre importación y exportación para importar y exportar archivos individuales.
Consulta también la página de importación y exportación para conocer los métodos para importar automáticamente el archivo más reciente, basándose en una fecha del nombre del archivo o mirando los metadatos del mismo.
Consulta la página sobre Iteración, bucles y listas para ver un ejemplo con el paquete purrr demostrando:
- Dividir un dataframe y guardarlo como múltiples archivos CSV
- Dividir un dataframe y guardar cada parte como una hoja separada dentro de un libro de Excel
- Importar varios archivos CSV y combinarlos en un dataframe
- Importar un libro de Excel con varias hojas y combinarlas en un dataframe
45.8 R base
Mira a continuación las funciones list.files()
y dir()
, que realizan la misma operación de listar archivos dentro de un directorio especificado. Puedes especificar ignore.case =
o un patrón específico para buscar.
list.files(path = here("data"))
list.files(path = here("data"), pattern = ".csv")
# dir(path = here("data"), pattern = ".csv")
list.files(path = here("data"), pattern = "evd", ignore.case = TRUE)
Si un archivo está actualmente “abierto”, se mostrará en su carpeta con una tilde delante, como “~$hospital_linelists.xlsx”.