How to remove a directory in R?
RDirectoryR Problem Overview
After some research I found out that the following works:
unlink("mydir")
and you have to use the recursive
option in case you want to remove recursively:
unlink("mydir", recursive=TRUE)
However, I noted that unlink("mydir")
alone, without the recursive
option, does not produce any output when mydir
contains subdirectories: it does not remove the dirs but does not show any warning. Just nothing:
> 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"
Is there any way to get any kind of "notification", like the one you would get in UNIX systems?
$ rmdir test
rmdir: failed to remove «test»: Directory not empty
I am using R version 3.1.2 (2014-10-31). I tried playing with options(warn=1)
etc but no luck.
R Solutions
Solution 1 - R
See help ?unlink
:
> Value > > 0 for success, 1 for failure, invisibly. Not deleting a non-existent > file is not a failure, nor is being unable to delete a directory if > recursive = FALSE. However, missing values in x are regarded as > failures.
In the case where there is a folder foo
the unlink
call without recursive=TRUE
will return 1
.
Note that actually the behavior is more like rm -f
, which means that unlinking a non-existent file will return 0.
Solution 2 - R
Simply
unlink("mydir", recursive = TRUE) # will delete directory called 'mydir'
Solution 3 - R
Here's a wrapper function for you if you really need to see an error msg:
.unlink <- function(x, recursive = FALSE, force = FALSE) {
if (unlink(x, recursive, force) == 0)
return(invisible(TRUE))
stop(sprintf("Failed to remove [%s]", x))
}
Solution 4 - R
For those stumbling on this, I normally resort to using 'shell' command here to completely delete the folder.
Using 'system' will print a 127 error if the folder is non-empty.
The following is the simple nuclear option - deleting the folder in its entirety (no questions asked):
Loc <- "C:/file has spaces/hence the form below/"
shell( glue::glue("rmdir /s /q \"{Loc}\" ") )