web-dev-qa-db-fra.com

Comment supprimer un répertoire en R?

Après quelques recherches, j'ai découvert que les travaux suivants:

unlink("mydir")

et vous devez utiliser l'option recursive au cas où vous voudriez supprimer récursivement:

unlink("mydir", recursive=TRUE)

Cependant, j'ai remarqué que unlink("mydir") seul, sans l'option recursive, ne produit aucun résultat lorsque mydir contient des sous-répertoires: il ne supprime pas les répertoires mais ne montre aucun avertissement. Juste rien:

> list.dirs()
[1] "."          "./r"
> dir.create("test")
> dir.create("test/test2")
> list.dirs()
[1] "."            "./r"   "./test"       "./test/test2"
> unlink("test")          ######### here I would expect a warning #########
> list.dirs()
[1] "."            "./r"   "./test"       "./test/test2"
> unlink("test", recursive=TRUE)
> list.dirs()
[1] "."          "./r"

Existe-t-il un moyen d’obtenir une sorte de "notification", comme celle que vous obtiendriez sous UNIX?

$ rmdir test
rmdir: failed to remove «test»: Directory not empty

J'utilise R version 3.1.2 (2014-10-31). J'ai essayé de jouer avec options(warn=1) etc. mais pas de chance.

33
fedorqui

Voir l'aide ?unlink:

Valeur

0 pour le succès, 1 pour l'échec, de manière invisible. Ne pas supprimer un inexistant Le fichier n’est pas un échec, ni l’impossibilité de supprimer un répertoire si récursif = FALSE. Cependant, les valeurs manquantes dans x sont considérées comme les échecs.

Dans le cas où il existe un dossier foo, l'appel unlink sans recursive=TRUE renverra 1.

Notez qu'en réalité, le comportement s'apparente davantage à rm -f, ce qui signifie que la dissociation d'un fichier non existant retournera 0.

31
Ziyao Wei

Voici une fonction de wrapper pour vous si vraiment devez voir un message d'erreur:

.unlink <- function(x, recursive = FALSE, force = FALSE) {
  if (unlink(x, recursive, force) == 0)
    return(invisible(TRUE))
  stop(sprintf("Failed to remove [%s]", x))
}
5
hrbrmstr

Pour ceux qui tombent sur cela, je recourt normalement à l’utilisation de la commande système ici.

unlink supprime le contenu du dossier - mais conserve le dossier racine lui-même.

Voici l'option nucléaire simple - supprimer le dossier dans son intégralité (ce qui est souvent ce dont j'ai besoin) - écrite pour que vous puissiez voir facilement les composants:

Loc <- "mydir"
system(paste0("rm -r ", Loc))
0
Nick