Search code examples
rr-forge

Automatically update packages installed from R-forge


I recently installed R-2.12.0 from R-2.11.1 and I've updated all CRAN packages via:

update.packages(checkBuilt=TRUE, ask=FALSE)

Now I want to update all the packages I have installed from R-forge, but only if they're not available on CRAN. In other words, I cannot simply run:

update.packages(checkBuilt=TRUE, ask=FALSE, repos="http://r-forge.r-project.org")

because it would install the R-forge version of the survival package over the version that came with R-2.12.0.

I could probably use some combination of the information from old.packages and packageStatus to determine which packages exist only on R-forge, but I wanted to ask if there was an easier way before building a custom solution.


Solution

  • How about this:

    # 1. Get the list of packages you have installed, 
    #    use priority to exclude base and recommended packages.
    #    that may have been distributed with R.
    pkgList <- installed.packages(priority='NA')[,'Package']
    
    # 2. Find out which packages are on CRAN and R-Forge.  Because
    #    of R-Forge build capacity is currently limiting the number of
    #    binaries available, it is queried for source packages only.
    CRANpkgs <- available.packages(
      contriburl=contrib.url('http://cran.r-project.org'))[,'Package']
    forgePkgs <- available.packages(
      contriburl=contrib.url('http://r-forge.r-project.org', type='source')
    )[,'Package']
    
    # 3. Calculate the set of packages which are installed on your machine,
    #    not on CRAN but also present on R-Force.
    pkgsToUp <- intersect(setdiff(pkgList, CRANpkgs), forgePkgs)
    
    # 4. Update the packages, using oldPkgs to restrict the list considered.
    update.packages(checkBuilt=TRUE, ask=FALSE,
      repos="http://r-forge.r-project.org",
      oldPkgs=pkgsToUp)
    
    # 5. Profit?