45  Interactions avec les répertoires

Dans cette page, nous couvrons les scénarios courants où vous créez, interagissez avec, enregistrez et importez avec des répertoires (dossiers).

45.1 Préparation

Paquet fs

Le paquet fs est un paquet tidyverse qui facilite les interactions avec les répertoires, en améliorant certaines des fonctions base de R. Dans les sections ci-dessous, nous utiliserons souvent des fonctions de fs.

pacman::p_load(
  fs, # interactions fichiers/répertoires
  rio, # importation/exportation
  here, # chemins d'accès relatifs aux fichiers
  tidyverse) # gestion et visualisation des données

Imprimer le répertoire comme un arbre de dendrogramme

Utilisez la fonction dir_tree() de fs.

Fournissez le chemin d’accès au dossier dans path = et décidez si vous voulez afficher un seul niveau (recurse = FALSE) ou tous les fichiers de tous les sous-niveaux (recurse = TRUE). Ci-dessous, nous utilisons here() comme raccourci pour le projet R et spécifions son sous-dossier “data”, qui contient toutes les données utilisées pour ce manuel R. Nous le paramétrons pour afficher tous les fichiers contenus dans “data” et ses sous-dossiers (par exemple “cache”, “modèles épidémiques”, “population”, “shp” et “weather”).

fs::dir_tree(path = here("data"), recurse = TRUE)
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917cf892501/epiRhandbook_eng/data
├── africa_countries.geo.json
├── cache
│   └── epidemic_models
│       ├── 2015-04-30
│       │   ├── estimated_reported_cases_samples.rds
│       │   ├── estimate_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_cleaned.xlsx
│   └── linelist_raw.xlsx
├── country_demographics.csv
├── covid_example_data
│   ├── covid_example_data.xlsx
│   └── covid_shapefile
│       ├── FultonCountyZipCodes.cpg
│       ├── FultonCountyZipCodes.dbf
│       ├── FultonCountyZipCodes.prj
│       ├── FultonCountyZipCodes.sbn
│       ├── FultonCountyZipCodes.sbx
│       ├── FultonCountyZipCodes.shp
│       ├── FultonCountyZipCodes.shp.xml
│       └── FultonCountyZipCodes.shx
├── covid_incidence.csv
├── covid_incidence_map.R
├── district_count_data.xlsx
├── example
│   ├── Central Hospital.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
│   ├── Military Hospital.csv
│   ├── Missing.csv
│   ├── Other.csv
│   ├── Port Hospital.csv
│   └── St. Mark's Maternity Hospital (SMMH).csv
├── facility_count_data.rds
├── flexdashboard
│   ├── outbreak_dashboard.html
│   ├── outbreak_dashboard.Rmd
│   ├── outbreak_dashboard_shiny.Rmd
│   ├── outbreak_dashboard_test.html
│   └── outbreak_dashboard_test.Rmd
├── fluH7N9_China_2013.csv
├── 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.rds
├── linelist_cleaned.xlsx
├── linelist_raw.xlsx
├── make_evd_dataset-DESKTOP-JIEUMMI.R
├── 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
│   ├── sample_data_Shigella_tree.csv
│   ├── Shigella_subtree_2.nwk
│   ├── Shigella_subtree_2.txt
│   └── Shigella_tree.txt
├── rmarkdown
│   ├── outbreak_report.docx
│   ├── outbreak_report.html
│   ├── outbreak_report.pdf
│   ├── outbreak_report.pptx
│   ├── outbreak_report.Rmd
│   ├── report_tabbed_example.html
│   └── report_tabbed_example.Rmd
├── 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 Lister les fichiers d’un répertoire

Pour lister uniquement les noms de fichiers d’un répertoire, vous pouvez utiliser dir() à partir de base R. Par exemple, cette commande liste les noms des fichiers contenus dans le sous-dossier “population” du dossier “data” d’un projet R. Le chemin de fichier relatif est fourni en utilisant here(). (dont vous trouverez plus d’informations sur la page Importer et exporter des données ).

# noms de fichiers
dir(here("data", "gis", "population"))
[1] "sle_admpop_adm3_2020.csv"                       
[2] "sle_population_statistics_sierraleone_2020.xlsx"

Pour lister les chemins complets des fichiers du répertoire, vous pouvez utiliser dir_ls() de fs. Une alternative R base est list.files().

# chemins d'accès aux fichiers
dir_ls(here("data", "gis", "population"))
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917cf892501/epiRhandbook_eng/data/gis/population/sle_admpop_adm3_2020.csv
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917cf892501/epiRhandbook_eng/data/gis/population/sle_population_statistics_sierraleone_2020.xlsx

Pour obtenir toutes les informations sur les métadonnées de chaque fichier d’un répertoire (par exemple le chemin, la date de modification, etc.), vous pouvez utiliser dir_info() de fs.

Cela peut être particulièrement utile si vous voulez extraire la date de dernière modification du fichier, par exemple si vous voulez importer la version la plus récente d’un fichier. Pour un exemple de ceci, voir la page Importer et exporter des données.

# informations sur le fichier
dir_info(here("data", "gis", "population"))

Voici le cadre de données renvoyé. Faites défiler vers la droite pour voir toutes les colonnes.

45.3 Informations sur les fichiers

Pour extraire des informations de métadonnées sur un fichier spécifique, vous pouvez utiliser file_info()de fs (ou file.info()de base R).

file_info(here("data", "case_linelists", "linelist_cleaned.rds"))

Ici, nous utilisons le $ pour indexer le résultat et retourner uniquement la valeur modification_time.

file_info(here("data", "case_linelists", "linelist_cleaned.rds"))$modification_time
[1] "2024-09-18 21:13:02 +07"

45.4 Vérifier s’il existe

Objets R

Vous pouvez utiliser exists() de base R pour vérifier si un objet R existe dans R (fournir le nom de l’objet entre guillemets).

exists("linelist")
[1] FALSE

Notez que certains paquets R base utilisent des noms d’objets génériques comme “data” en coulisse, qui apparaîtront comme VRAIS à moins que inherit = FALSE soit spécifié. C’est une des raisons pour ne pas nommer votre jeu de données “data”.

exists("data")
[1] TRUE
exists("data", inherit = FALSE)
[1] FALSE

Si vous écrivez une fonction, vous devriez utiliser missing() de base R pour vérifier si un argument est présent ou non, au lieu de exists().

Répertoires

Pour vérifier si un répertoire existe, fournissez le chemin du fichier (et son nom) à is_dir() de fs. Faites défiler vers la droite pour voir que TRUE est imprimé.

is_dir(here("data"))
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917cf892501/epiRhandbook_eng/data 
                                                                                 TRUE 

Une alternative est file.exists() de base R.

Les fichiers

Pour vérifier si un fichier spécifique existe, utilisez is_file() de fs. Faites défiler vers la droite pour voir que TRUE est imprimé.

is_file(here("data", "case_linelists", "linelist_cleaned.rds"))
C:/Users/ngulu864/AppData/Local/Temp/RtmpQXbGPz/file917cf892501/epiRhandbook_eng/data/case_linelists/linelist_cleaned.rds 
                                                                                                                     TRUE 

Une alternative base R est file.exists().

45.5 Créer

Répertoires

Pour créer un nouveau répertoire (dossier), vous pouvez utiliser dir_create() de fs. Si le répertoire existe déjà, il ne sera pas écrasé et aucune erreur ne sera retournée.

dir_create(here("data", "test"))

Une alternative est dir.create() de base R, qui affichera une erreur si le répertoire existe déjà. En revanche, dir_create() dans ce scénario sera silencieux.

Fichiers

Vous pouvez créer un fichier (vide) avec file_create() à partir de fs. Si le fichier existe déjà, il ne sera pas écrasé ou modifié.

file_create(here("data", "test.rds"))

Une alternative R base est file.create(). Mais si le fichier existe déjà, cette option le tronquera. Si vous utilisez file_create(), le fichier sera laissé inchangé.

Créer si n’existe pas

EN COURS DE CONSTRUCTION

45.5.1 Supprimer

Objets R

Utilisez rm() de base R pour supprimer un objet R.

45.5.2 Répertoires

Utilisez dir_delete() de fs.

45.5.3 Fichiers

Vous pouvez supprimer des fichiers avec file_delete() de fs.

45.5.4 Exécuter d’autres fichiers

source()

Pour exécuter un script R à partir d’un autre script R, vous pouvez utiliser la commande source() (de base R).

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

Cela revient à afficher le script R ci-dessus et à cliquer sur le bouton “Source” en haut à droite du script. Ceci exécutera le script mais le fera silencieusement (pas de sortie sur la console R) sauf si cela est spécifiquement prévu. Voir la page Graphiques interactifs pour des exemples d’utilisation de source() pour interagir avec un utilisateur via la console R en mode question-réponse.

render()

render() est une variation de source() le plus souvent utilisée pour les scripts R markdown. Vous fournissez le input = qui est le fichier R markdown, et aussi le output_format = (typiquement soit “html_document”, “pdf_document”, “word_document”, ““).

Voir la page sur les Production de rapports avec R Markdown pour plus de détails. Consultez également la documentation de render() ici ou en entrant ?render.

Exécuter des fichiers dans un répertoire

Vous pouvez créer une boucle for et l’utiliser pour source() chaque fichier d’un répertoire, tel qu’identifié avec dir().

for(script in dir(here("scripts"), pattern = ".R$")) { # pour chaque nom de script dans le dossier "scripts" du projet R (avec l'extension .R)
  source(here("scripts", script))                        # source le fichier avec le nom correspondant qui existe dans le dossier scripts
}

Si vous ne voulez exécuter que certains scripts, vous pouvez les identifier par leur nom comme ceci :

scripts_to_run <- c(
     "epicurves.R",
     "demographic_tables.R",
     "survival_curves.R"
)

for(script in scripts_to_run) {
  source(here("scripts", script))
}

Voici une comparaison des fonctions R fs et base.

Importer des fichiers dans un répertoire

Voir la page Importer et exporter des données pour importer et exporter des fichiers individuels.

Consultez également la page Importer et exporter des données pour connaître les méthodes permettant d’importer automatiquement le fichier le plus récent, en fonction d’une date figurant dans le nom du fichier ou en examinant les métadonnées du fichier.

Voir la page Itération, boucles et listes pour un exemple avec le paquet purrr démontrant :

  • La division d’un cadre de données et son enregistrement dans plusieurs fichiers CSV.
  • Division d’un cadre de données et enregistrement de chaque partie comme une feuille séparée dans un classeur Excel.
  • Importer plusieurs fichiers CSV et les combiner en un seul cadre de données.
  • Importer un classeur Excel avec plusieurs feuilles et les combiner dans un cadre de données.

45.6 base R

Voir ci-dessous les fonctions list.files() et dir(), qui effectuent la même opération de listage des fichiers dans un répertoire spécifié. Vous pouvez spécifier ignore.case = ou un motif spécifique à rechercher.

list.files(path = ici("data"))

list.files(path = ici("data"), pattern = ".csv")
# dir(path = ici("data"), pattern = ".csv")

list.files(path = ici("data"), pattern = "evd", ignore.case = TRUE)

Si un fichier est actuellement “ouvert”, il s’affiche dans votre dossier avec un tilde devant, comme “~$hospital_linelists.xlsx”.

45.7 Ressources

https://cran.r-project.org/web/packages/fs/vignettes/function-comparisons.html