Gestion des fichiers et répertoires sous R

Auteur.e.s
Fabrice Dessaint, Inra
Résumé

Lorsque l’on travaille sous R, on a généralement besoin d’accéder à des informations contenues dans des fichiers. C’est même souvent la première étape d’une analyse. Savoir naviguer dans l’arborescence des dossiers, indiquer correctement la localisation des fichiers pour ensuite pouvoir les lire ou les écrire est essentiel.

R dispose donc de plusieurs fonctions qui vont permettre, sans quitter la session en cours, la gestion des chemins, des dossiers et des fichiers.

La gestion des chemins

L’utilisation d’un fichier ou d’un dossier passe par une étape de localisation indiquant où trouver le fichier ou le dossier. Cette localisation peut être absolue (on donne le chemin complet depuis la racine de l’arborescence) ou relative (elle se fait à partir d’un endroit particulier qui n’est plus la racine). Lorsqu’elle est relative, c’est le répertoire de travail de R (wd ou working directory) qui sert de référence et c’est à partir de ce répertoire que sont interprétés les chemins relatifs. C’est aussi dans ce répertoire que sont sauvegardés les fichiers.

La fonction getwd() affiche la localisation du répertoire de travail sous la forme d’un chemin absolu.

getwd()
[1] "/Users/fdessaint/R4ciam/GestionFichiers"

La forme du chemin dépend du système d’exploitation (ici avec MacOS) mais comprend toujours une série d’éléments séparés par un séparateur (/, \, //).

On peut modifier la localisation du répertoire de travail avec la fonction setwd(). Cette fonction possède un argument, dir, permettant de donner, sous la forme d’une chaîne de caractères, la nouvelle position (chemin absolu ou relatif) du répertoire de travail. Par exemple:

setwd(dir = "/Users/fdessaint/R4ciam/tmp")
getwd()
[1] "/Users/fdessaint/R4ciam/tmp"

La fonction peut résoudre les raccourcis contenus dans le chemin. Le tilde (~) est remplacé par le chemin du répertoire de l’utilisateur, le simple point (.) par le chemin du répertoire courant et le double point (..) par le répertoire parent du répertoire courant.

On aurait donc pu remplacer l’instruction précédente par

setwd(dir = "~/R4ciam/tmp")
# ou
setwd("../tmp")

Elle renvoie, de façon invisible, la valeur de l’ancien répertoire de travail. On peut donc modifier de façon temporaire la localisation du répertoire de travail puis revenir à sa valeur initiale.

oldWD <- setwd("../tmp")
oldWD
[1] "/Users/fdessaint/R4ciam/GestionFichiers"

Attention: le répertoire doit exister avant le changement de localisation. Dans le cas contraire, la fonction retourne un message d’erreur.

La commande path.expand() remplace le raccourci ~ par le chemin du répertoire de l’utilisateur. Par contre, elle ne sait pas résoudre les raccourcis .. et .. C’est la fonction normalizePath() qui le permet.

path.expand(path = "~/R4ciam")
[1] "/Users/fdessaint/R4ciam/ 
path.expand(path = ".")
[1] "."
normalizePath(path = ".")
[1] "/Users/fdessaint/R4ciam/tmp"

Deux fonctions permettent de découper un chemin. La fonction basename() extrait le dernier élément d’un chemin (sans le séparateur)

basename(path = oldWD)
[1] "GestionFichiers"

et la fonction dirname() extrait l’ensemble du chemin sauf le dernier élément (sans le dernier séparateur).

dirname(path = oldWD)
[1] "/Users/fdessaint/R4ciam"

Enfin, la fonction file.path() permet de construire un chemin à partir d’éléments séparés contenus dans des chaines de caractères. Le séparateur utilisé entre les éléments, va alors dépendre du système d’exploitation utilisé (valeur contenue dans l’objet .Platform$file.sep).

file.path(dirname(path = oldWD), basename(path = oldWD))
[1] "/Users/fdessaint/R4ciam/GestionFichiers"

On peut cependant imposer un séparateur particulier avec l’argument fsep.

La gestion des dossiers

Les fonctions dir() et list.files() permettent de connaitre le contenu d’un dossier. Par défaut, seuls les noms des fichiers non cachés et des sous-dossiers (sans leur contenu) sont affichés.

dir(path = R.home())
 [1] "bin"          "COPYING"      "doc"          "etc"          "fontconfig"  
 [6] "include"      "Info.plist"   "lib"          "library"      "man1"        
[11] "modules"      "NEWS"         "NEWS.pdf"     "R"            "Rscript"     
[16] "share"        "SVN-REVISION" "tests" 

Ces fonctions possèdent plusieurs arguments optionnels qui permettent d’affiner les résultats affichés. On peut en particulier, afficher le contenu des sous-dossiers avec l’argument recursive=TRUE de façon récursive et afficher les éléments cachés avec l’argument all.files=TRUE.

On peut aussi n’afficher que les éléments ayant une forme particulière avec l’argument pattern.

dir(path = R.home(), pattern = "*.pdf$", recursive = TRUE)[1:6]
[1] "bin/qpdf"                  "bin/Rd2pdf"            "doc/manual/fullrefman.pdf"    "doc/manual/R-admin.pdf"   
[5] "doc/manual/R-data.pdf"     "doc/manual/R-exts.pdf"   

La fonction dir.create() permet de créer un nouveau dossier. Par défaut, seul le dernier élément du chemin est créé. Cela implique que le reste de l’arborescence existe déjà. Si ce n’est pas le cas, on utilisera l’argument recursive=TRUE.

La gestion des fichiers

R dispose de plusieurs fonctions permettant de faire des opérations de base sur les fichiers:

  • file.create() Crée un ou plusieurs fichiers vides, sans contenu. Les fichiers créés sont des fichiers sans structure (fichier “texte”). Si le fichier existe déjà, il est vidé. Il est toujours présent, mais il ne contient plus d’informations

  • file.remove() Efface un ou plusieurs fichiers

  • file.rename() Change le nom d’un fichier. Si le nouveau nom correspond à un fichier déjà présent dans le répertoire, ce fichier est remplacé

  • file.copy() Copie un fichier et lui donne un nouveau nom. Lorsqu’il existe déjà un fichier de même nom, la copie n’est pas réalisé et R affiche la valeur logique FALSE

  • file.append() Ajoute le contenu d’un second fichier au contenu d’un premier.

  • file.exists() Vérifie l’existence d’un ou plusieurs fichiers. Si le fichier existe déjà, R affiche la valeur logique TRUE

Sous Windows ou MacOS, la fonction file.choose() ouvre une fenêtre permettant une navigation interactive dans l’arborescence et le choix d’un fichier.

cat("Essai 2", file = file.choose())

Sous linux, on peut utiliser

library("tcltk")
cat("Essai 2", file = tk_choose.files())

La fonction file.info() permet l’affichage d’informations sur un fichier ou sur le contenu d’un répertoire.

file.info("Fichier1")
         size isdir mode               mtime               ctime               atime uid gid     uname grname
Fichier1   20 FALSE  644 2013-10-05 09:48:41 2013-10-05 09:48:41 2013-10-05 09:49:04 501  20 fdessaint  staff

Parmi les informations affichées, les premières colonnes donnent la taille, si l’élément est un répertoire et les permissions (lecture, écriture et exécution).

Versions des outils utilisés
R version 3.4.2 (2017-09-28)
Thèmes de la fiche
Thèmes