2015-01-22 10 views
24

Dopo alcune ricerche ho scoperto che le seguenti opere:Come rimuovere una directory in R?

unlink("mydir") 

ed è necessario utilizzare l'opzione recursive nel caso in cui si desidera rimuovere in modo ricorsivo:

unlink("mydir", recursive=TRUE) 

Tuttavia, ho notato che solo unlink("mydir") , senza l'opzione recursive, non produce alcun output quando mydir contiene sottodirectory: non rimuove le directory ma non mostra alcun avviso. Proprio nulla:

> 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" 

C'è un modo per ottenere qualsiasi tipo di "notifica", come quello che si potrebbe avere in sistemi UNIX?

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

Sto usando R versione 3.1.2 (2014/10/31). Ho provato a giocare con options(warn=1) ecc. Ma senza fortuna.

+0

@userJT molto vero. [php] (http://php.net/manual/en/function.unlink.php) ha anche questo problema, entrambi provenienti da ['unlink'] (http://linux.die.net/man/2/unlink) in UNIX. – fedorqui

risposta

21

vedere la Guida ?unlink:

Valore

0 per il successo, 1 per il fallimento, in modo invisibile. La mancata eliminazione di un file inesistente non è un errore e non è possibile eliminare una directory se ricorsiva = FALSE. Tuttavia, i valori mancanti in x sono considerati come errori .

Nel caso in cui v'è una cartella foo la chiamata unlink senza recursive=TRUE tornerà 1.

nota che in realtà il comportamento è più simile a rm -f, il che significa che lo scollegamento di un file inesistente restituisce 0.

+0

Interessante ... L'ho appena provato: efficacemente '> print (unlink (" test "))' restituisce '[1] 1' e'> print (unlink ("test", recursive = TRUE)) restituisce '[ 1] 0' perché ha avuto successo. Quindi questo significa che l'unico modo per sapere se la cancellazione è stata efficace è catturare il codice di ritorno del comando 'unlink' ... Lo capisco ma sembra un po 'controintuitivo. – fedorqui

4

Ecco una funzione wrapper per voi se davvero bisogno di vedere un msg di errore:

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

potresti rendere 'unlink <-' e fare' base :: unlink' nella funzione effettiva, ma ciò sembra sbagliato. se hai degli script automatici che devono sapere se una dir è stata cancellata, testerei solo il valore restituito. – hrbrmstr

+0

Molto interessante, grazie! Sto solo iniziando con R, quindi dovrò leggere attentamente il codice per comprendere appieno tutte le funzioni che usi :) – fedorqui