× ¿Necesitas ayuda para aprender R? Inscríbete en el Curso de introducción a R de Applied Epi, prueba nuestros Tutoriales gratuitos de R, escribe en nuestro Foro de preguntas y respuestas, o pregunta por nuestra Asistencia técnica para R.

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”).

fs::dir_tree(path = here("data"), recurse = TRUE)
## /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).

# nombres de archivo
dir(here("data", "gis", "population"))
## [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

Crear si no existe

EN CONSTRUCCIÓN

45.6 Borrar

Objetos R

Utiliza rm() de R base para eliminar un objeto R.

Directorios

Utiliza dir_delete() de fs.

Archivos

Puedes eliminar archivos con file_delete() de fs.

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).

source(here("scripts", "cleaning_scripts", "clean_testing_data.R"))

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”.