Skip to content

install.packages() removes package on Windows

4 messages · Henrik Bengtsson, Jon Olav Skoien, Dan Tenenbaum

#
Hi,

Starting with the XML package installed:
[1] TRUE
I ran the following script:

pkgs <- c("XML")

for (i in 1:100)
{
    install.packages(pkgs, repos="http://cran.fhcrc.org")
    if (!all(pkgs %in% rownames(installed.packages())))
    {
        print("failed to install pkgs!")
        print(paste("Iteration", i))
        break
    }
}

And it failed on the third iteration:

trying URL 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
Content type 'application/zip' length 4287270 bytes (4.1 Mb)
opened URL
downloaded 4.1 Mb

package 'XML' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
        C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
trying URL 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
Content type 'application/zip' length 4287270 bytes (4.1 Mb)
opened URL
downloaded 4.1 Mb

package 'XML' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
        C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
trying URL 'http://cran.fhcrc.org/bin/windows/contrib/3.0/XML_3.98-1.1.zip'
Content type 'application/zip' length 4287270 bytes (4.1 Mb)
opened URL
downloaded 4.1 Mb

package 'XML' successfully unpacked and MD5 sums checked
Warning: cannot remove prior installation of package 'XML'

The downloaded binary packages are in
        C:\Users\biocbuild\AppData\Local\Temp\3\Rtmps7OWh0\downloaded_packages
[1] "failed to install pkgs!"
[1] "Iteration 3"

At this point the XML package is not installed:
[1] FALSE

Any idea what could cause this? There is no virus scanner running. 

I notice the warning about failing to remove prior installation, but it looks like it removed enough of it so that XML is no longer installed.

I realize my script is a little contrived but I'm trying to track down an elusive problem in our build system that is causing a lot of grief....this may or may not be the same problem but it's certainly a problem, so I thought I'd report it. 

Is there a workaround?

I've only ever seen this issue on Windows.

I did try running the same script on a vanilla windows machine and it did not fail. In fact, it does not always fail on the machine where it fails above. But once is enough to mess us up.
R version 3.0.2 (2013-09-25)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

Thanks,
Dan
#
My guess is that the DLL of the already installed XML package is
loaded by another R session and that prevents the corresponding DLL
file:
[1] "i386/XML.dll" "x64/XML.dll"

from being deleted by install.packages() -> unpackPkgZip() ->

            ret <- unlink(instPath, recursive=TRUE, force=TRUE)

which gives the warnings.  You can verify this by checking that all
files but the DLLs are deleted;
REPRODUCIBLE EXAMPLE:

# Download package with native code (=has DLLs)
url <- "http://cran.r-project.org/bin/windows/contrib/r-release/png_0.1-6.zip"
pkgfile <- basename(url)
if (!file_test("-f", pkgfile)) download.file(url, dest=pkgfile, mode="wb")

# Setup temporary library
if (!file_test("-d", "local-libs")) dir.create("local-libs")

# Install to temporary library
install.packages(pkgfile, repos=NULL, lib="local-libs")

# Record package path
path <- system.file(package="png", lib.loc="local-libs")

# Launch *another* session that loads the package
Rscript <- file.path(R.home("bin"), "Rscript")
code <- "library('png', lib.loc='local-libs'); img <-
readPNG(system.file('img','Rlogo.png',package='png')); Sys.sleep(60)"
code <- "library('png', lib.loc='local-libs'); Sys.sleep(60)"
system2(Rscript, args=c("-e", dQuote(code)), wait=FALSE)

# Try to install; will fail
install.packages(pkgfile, repos=NULL, lib="local-libs")
## Gives:
## package 'png' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'png'
files <- list.files(path, recursive=TRUE)
print(files)
## [1] "libs/x64/png.dll"


SUGGESTION:
The problem is that unlink(..., recursive=TRUE) is not atomic, leaving
a corrupt installation behind.  A better solution would be to use
file.rename() to move the existing installation to a temporary
directory/location, move the new installation in place, and then
remove the temporary/old one.  The last step will fail if there is a
session holding onto the DLL, but at least it does not leave a corrupt
installation behind.


/Henrik
On Thu, Oct 10, 2013 at 4:28 PM, Dan Tenenbaum <dtenenba at fhcrc.org> wrote:
#
On 11-Oct-13 3:15, Henrik Bengtsson wrote:
There is an option to avoid the corrupted installations when running 
multiple instances of R:
options(install.lock = TRUE)
https://stat.ethz.ch/pipermail/r-help/2010-December/263722.html
Not sure if this will solve the original problem though.

Best wishes,
Jon

  
    
#
Thanks Henrik and Jon, that's very helpful.
Dan


----- Original Message -----