fedorqui
fedorqui

Reputation: 290445

How to remove a directory in R?

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.

Upvotes: 101

Views: 78462

Answers (5)

LMc
LMc

Reputation: 18732

Try dir_delete() from the fs (file system), which is also vectorized:

library(fs)

dir_create(c("this/is/a/test/dir", "another/test/dir"))
file_create(c("this/is/a/test/text.txt", "this/is/another_text.txt", "another/test.txt"))

dir_tree("this")
this
└── is
    ├── a
    │   └── test
    │       ├── dir
    │       └── text.txt
    └── another_text.txt

dir_delete(c("this", "another"))

Upvotes: 1

stevec
stevec

Reputation: 52937

Simply

unlink("mydir", recursive = TRUE) # will delete directory called 'mydir'

Upvotes: 27

Nick
Nick

Reputation: 3384

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}\" ") )

Upvotes: 1

hrbrmstr
hrbrmstr

Reputation: 78842

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))
}

Upvotes: 7

zw324
zw324

Reputation: 27210

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.

Upvotes: 75

Related Questions