Как удалить каталог в R?
После некоторых исследований выяснилось, что следующие работы:
unlink("mydir")
и вы должны использовать опцию recursive
, если вы хотите удалить рекурсивно:
unlink("mydir", recursive=TRUE)
Однако я заметил, что unlink("mydir")
один, без опции recursive
, не производит никакого вывода, когда mydir
содержит подкаталоги: он не удаляет директории, но не показывает никаких предупреждений. Просто ничего:
> 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"
Есть ли способ получить какое-либо "уведомление", подобное тому, которое вы получите в системах UNIX?
$ rmdir test
rmdir: failed to remove «test»: Directory not empty
Я использую R версию 3.1.2 (2014-10-31). Я пробовал играть с options(warn=1)
и т.д., Но не повезло.
Ответы
Ответ 1
См. справку ?unlink
:
Значение
0 для успеха, 1 для отказа, невидимо. Не удалять несуществующие файл не является отказом и не может удалить каталог, если рекурсивный = ЛОЖЬ. Однако недостающие значения в x рассматриваются как неудачи.
В случае, если есть папка foo
, вызов unlink
без recursive=TRUE
вернет 1
.
Обратите внимание, что на самом деле поведение больше похоже на rm -f
, что означает, что отмена несуществующего файла вернет 0.
Ответ 2
Здесь вам нужна функция обертки, если вам действительно нужно увидеть сообщение об ошибке:
.unlink <- function(x, recursive = FALSE, force = FALSE) {
if (unlink(x, recursive, force) == 0)
return(invisible(TRUE))
stop(sprintf("Failed to remove [%s]", x))
}
Ответ 3
Для тех, кто спотыкается об этом, я обычно прибегаю к использованию здесь системных команд.
unlink удалит содержимое папки, но оставит корневую папку самой.
Ниже приведен простой ядерный вариант - полное удаление папки (что часто требуется), написанный так, чтобы вы могли легко видеть компоненты:
Loc <- "mydir"
system(paste0("rm -r ", Loc))
Ответ 4
Просто
unlink("mydir") # will delete directory called 'mydir'