9
votes

I'm trying to download and extract a zip file using R. Whenever I do so I get the error message

Error in unzip(temp, list = TRUE) : 'exdir' does not exist

I'm using code based on the Stack Overflow question Using R to download zipped data file, extract, and import data

To give a simplified example:

# Create a temporary file
temp <- tempfile()

# Download ZIP archive into temporary file
download.file("http://cran.r-project.org/bin/windows/contrib/r-release/ggmap_2.2.zip",temp)

# ZIP is downloaded successfully:

# trying URL 'http://cran.r-project.org/bin/windows/contrib/r-release/ggmap_2.2.zip'
# Content type 'application/zip' length 4533970 bytes (4.3 Mb)
# opened URL
# downloaded 4.3 Mb

# Try to do something with the downloaded file
unzip(temp,list=TRUE)

# Error in unzip(temp, list = TRUE) : 'exdir' does not exist

What I've tried so far:

  • Accessing the temp file manually and unzipping it with 7zip: Can do this no problem, file is there and accessible.
  • Changing the temp directory to c:\temp. Again, the file is downloaded successfully, I can access it and unzip it with 7zip but R throws the exdir error message when it tries to access it.

R version 2.15.2

R-Studio version 0.97.306

Edit: The code works if I use unz instead of unzip but I haven't been able to figure out why one works and the other doesn't. From CRAN guidance:

  • unz reads (only) single files within zip files...
  • unzip extracts files from or list a zip archive
4
Your code works for me, no errors.Jouni Helske
I've just edited the question, unz seems to work fine for me but not unzip.Tumbledown
Just to make sure, did you have permissions to write in your temp directory and you have enough space? Also try if the same things works with classic R (not from Rstudio), I have had similar kind of issues with Eclipse/StatET sometimes.Jouni Helske
Yeah the permissions were fine so far as I can see, the unz function can write to the folder without any problem and I also tried switching to c:\temp with the same results. I'm just using unz now, I'll have to figure out the difference between the two functions later.Tumbledown

4 Answers

13
votes

On a windows setup: I had this error when I had exdir specified as a path. For me the solution was removing the trailing / or \\ in the path name.

Here's an example and it did create the new folder if it didn't already exist

locFile <- pathOfMyZipFile
outPath <- "Y:/Folders/MyFolder"
# OR
outPath <- "Y:\\Folders\\MyFolder"

unzip(locFile, exdir=outPath)
2
votes

A couple of years late but I still get this error when trying to use unzip(). It appears to be a bug because the man pages for unzip state if exdir is specified it will be created:

exdir The directory to extract files to (the equivalent of unzip -d). It will be created if necessary.

A workaround I've been using is to manually create the necessary directory:

dir.create("directory")
unzip("file-to-unzip.zip", exdir = "directory/")

A pain, but it seems to work, at least for me.

2
votes

This can manifest another way, and the documentation doesn't make clear the cause. Your exdir cannot end in a "/", it must be just the name of the target folder.

For example, this was failing with 'exdir' does not exist:

unzip(temp, overwrite = F, exdir = "data_raw/system-data/")

And this worked fine:

unzip(temp, overwrite = F, exdir = "data_raw/system-data")

Presumably when unzip sees the "/" at the end of the exdir path it keeps looking; whereas omitting the "/" tells unzip "you've found it, unzip here".

0
votes

I am using R3.2.1 on a Windows 7 machine.

The way I found to address this issue takes a few steps, but it works for me:

  1. Create a vector that contains the name of the url from where you are downloading the file, e.g.

file_url <- "http://your.file.com/file_name.zip"

  1. Use download.file to specify the url where you are downloading the file from (using your newly created vector), followed by the file name of the zipped file (that should be the last part of the url name). It will be saved as such in your working directory*, e.g.

download.file(file_url, "file_name.zip")

*If you are not sure of your working directory, you can use getwd() to check it. If you want to change your working directory, you can use setwd("C:users/username/...") to set it to what you want.

  1. Use "unzip" to unzip the file into your working directory, with the name you will set using exdir, e.g.

unzip("file_name.zip", exdir = "file_name")

  1. To check your work, you can use list.files, e.g.

list.files("file_name")

Hope this helps!