2015-01-22 22 views
24

Nach einigen Recherchen fand heraus, dass ich, dass die folgenden Werke:Wie entferne ich ein Verzeichnis in R?

unlink("mydir") 

und Sie haben die recursive Option verwenden, falls Sie rekursiv entfernen möchten:

unlink("mydir", recursive=TRUE) 

Allerdings habe ich festgestellt, allein dass unlink("mydir") , ohne die Option recursive, produziert keine Ausgabe, wenn mydir Unterverzeichnisse enthält: Es entfernt nicht die Verzeichnisse, aber zeigt keine Warnung. Nur nichts:

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

Gibt es eine Möglichkeit, irgendeine Art von "Benachrichtigung" zu erhalten, wie die, die Sie in UNIX-Systemen bekommen würden?

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

Ich verwende R Version 3.1.2 (2014-10-31). Ich habe versucht, mit options(warn=1) usw. zu spielen, aber kein Glück.

+0

@userJT sehr wahr. [php] (http://php.net/manual/en/function.unlink.php) hat auch dieses Problem, beide kommen aus dem ['unlink'] (http://linux.die.net/man/2/unlink) Befehl in UNIX. – fedorqui

Antwort

21

Siehe Hilfe ?unlink:

Wert

0 für Erfolg, 1 für das Scheitern, unsichtbar. Das Löschen einer nicht vorhandenen Datei ist kein Fehler, und ein Verzeichnis kann auch nicht gelöscht werden, wenn recursive = FALSE ist. Fehlende Werte in x werden jedoch als Fehler angesehen.

In dem Fall, dass es sich um einen Ordner foo der unlink Anruf ohne recursive=TRUE1 zurück.

Beachten Sie, dass tatsächlich das Verhalten eher wie rm -f ist, was bedeutet, dass eine nicht vorhandene Datei Entkoppeln zurück ist 0.

+0

Interessant ... Ich habe gerade versucht: effektiv '> print (unlink ("test"))' 'kehrt [1] 1 'und'> print (unlink ("test", rekursive = TRUE))' 'kehrt [ 1] 0' weil es erfolgreich war. Dann bedeutet dies, dass der einzige Weg, um zu wissen, ob die Löschung effektiv war, darin besteht, den Return-Code des Befehls 'unlink' abzufangen ... Ich verstehe es, sieht aber ein wenig kontraintuitiv aus. – fedorqui

4

Hier ist eine Wrapper-Funktion für Sie, wenn Sie wirklich Notwendigkeit, einen Fehler msg zu sehen:

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

Sie könnten es machen "unlink <-' und tun" base :: unlink "in der eigentlichen Funktion, aber das scheint einfach falsch. Wenn Sie automatisierte Skripts haben, die wissen müssen, ob ein Verzeichnis gelöscht wird, dann würde ich einfach den Rückgabewert testen. – hrbrmstr

+0

Sehr interessant, danke! Ich fange gerade mit R an, also muss ich den Code sorgfältig lesen, um alle Funktionen zu verstehen, die du verwendest :) – fedorqui

Verwandte Themen