Painless way to install a new version of R?
Asked Answered
S

12

177

Andrew Gelman recently lamented the lack of an easy upgrade process for R (probably more relevant on Windows than Linux). Does anyone have a good trick for doing the upgrade, from installing the software to copying all the settings/packages over?

This suggestion was contained in the comments and is what I've been using recently. First you install the new version, then run this in the old verion:

#--run in the old version of R
setwd("C:/Temp/")
packages <- installed.packages()[,"Package"]
save(packages, file="Rpackages")

Followed by this in the new version:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)
Superordinate answered 9/9, 2009 at 20:29 Comment(2)
How up-to-date is the solution that has been used here?Pare
https://mcmap.net/q/98934/-update-r-using-rstudioEvade
M
78

Just for completeness, there are some ways to prevent you from having this problem. As Dirk said, save your packages in another directory on your computer.

install.packages("thepackage",lib="/path/to/directory/with/libraries")

You can change the default .Library value using the function .libPaths too

.libPaths("/path/to/directory/with/libraries")

This will put this path as a first value in the .Library variable, and will make it the default.

If you want to automate this further, you can specify this in the Rprofile.site file, which you find in the /etc/ directory of your R build. Then it will load automatically every time R loads, and you don't have to worry about that any more. You can just install and load packages from the specified directory.

Finally, I have some small code included in my Rprofile.site allowing me to reinstall all packages when I install a new R version. You just have to list them up before you update to the new R version. I do that using an .RData file containing an updated list with all packages.

library(utils)

## Check necessary packages
load("G:\Setinfo\R\packagelist.RData") # includes a vector "pkgs"
installed <- pkgs %in% installed.packages()[, 'Package']
if (length(pkgs[!installed]) >=1){
  install.packages(pkgs[!installed])
}

I make the packagelist.RData by specifying .Last() in my Rprofile.site. This updates the package list if I installed some :

.Last <- function(){
  pkgs <- installed.packages()[,1]
  if (length(pkgs) > length(installed)){
    save(pkgs,file="G:\Setinfo\R\packagelist.RData")
  }
}

When I install a new R version, I just add the necessary elements to the Rprofile.site file and all packages are reinstalled. I have to adjust the Rprofile.site anyway (using sum contrasts, adding the extra code for Tinn-R, these things), so it's not really extra work. It just takes extra time installing all packages anew.

This last bit is equivalent to what is given in the original question as a solution. I just don't need to worry about getting the "installed" list first.

Again, this doesn't work flawless if you have packages that are not installed from CRAN. But this code is easily extendible to include those ones too.

Mccraw answered 20/10, 2010 at 11:16 Comment(5)
@Prasad : Thx. The answer is a bit outdated though, R 2.12 and further automatically save the packages you install yourself somewhere in a standard library outside the main R tree. So all you have to do now is make sure you find that library and link to it, if that didn't happen by itself.Mccraw
@428790: Where can I find that library that you mention?Active
@DanielKrizian Look at the default in the internal object .Library. In my case, it points back to the R installation folder if unchanged (which I particularly dislike, but well)Mccraw
Recently I update R from 4.1 to 4.2, and failed to load any packages athough they were in the personal directory (say, ~/R/linux-arch/4.1). And I tried the .libPaths() method, it did not work well (some packages "work" again, while some dependencies not). Finally, I modified the lib directory name to "~/R/linux-arch/4.2", and it worked!Hambletonian
@Hambletonian : I don't see that you ran update.packages(ask=FALSE, checkBuilt=TRUE). That's necessary when updating R at second level updates, although not typically for third level e.g., 4.2.1 to 4.2.2.Staceystaci
B
46

If you are using Windows, you might want to use the installr package:

install.packages("installr")
require(installr)
updateR()

The best way of doing this is from the RGui system. All your packages will be transferred to the new folder and the old ones will be deleted or saved (you can pick either). Then once you open RStudio again, it immediately recognizes that you are using an updated version. For me this worked like a charm.

More info on installr here.

Burnsed answered 10/4, 2014 at 13:11 Comment(3)
What about packages installed through github?Herbartian
It should be mentioned that this is for Windows.Isomerize
This solution never seems to work on Windows 10Locular
G
27

Two quick suggestions:

  1. Use Gabor's batchfiles which are said to comprise tools helping with e.g. this bulk library relocations. Caveat: I have not used them.

  2. Don't install libraries within the 'filetree' of the installed R version. On Windows, I may put R into C:/opt/R/R-$version but place all libraries into C:/opt/R/library/ using the following snippet as it alleviates the problem in the first place:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"
Geometrician answered 9/9, 2009 at 21:5 Comment(4)
I wonder if transferring packages from, say, R 2.8 to R.9 causes any problems? Or will everything be fine as long as you do a update.packages in the new version?Kellykellyann
I have been doing this for quite a while and have not had problems. R is typically "forward compatible". And IIRC only one upgrade (may have been R 1.9 -> R 2.0) required a rebuild of all libraries.Geometrician
I also usually just copy my Library folder to my new installation and run update.packages. It seems to work fine. An optional install folder however is much more elegant.Jarad
Just to point out - I've added an answer with R code performing Dirk's suggestion (for R windows users)Harker
T
26

The method suggested above will not completely work if you have packages that are not from CRAN. For example, a personal package or a package downloaded from a non-CRAN site.

My preferred method on Windows (upgrading 2.10.1 to 2.11.0):

  1. Install R-2.11.0
  2. Copy R-2.10.0/library/* to R-2.11.0/library/
  3. Answer "no" to the prompts asking you if it is okay to overwrite.
  4. Start R 2.11.0
  5. Run the R command update.packages()
Tramontane answered 22/4, 2010 at 15:33 Comment(0)
N
7

With respect to the solution given in the question, it might not be easy to run your older version of R if you have already installed the new version. In this case, you can still reinstall all missing packages from the previous R version as follows.

# Get names of packages in previous R version
old.packages <- list.files("/Library/Frameworks/R.framework/Versions/3.2/Resources/library")

# Install packages in the previous version. 

# For each package p in previous version...
    for (p in old.packages) {
      # ... Only if p is not already installed
      if (!(p %in% installed.packages()[,"Package"])) {
        # Install p 
        install.packages(p) 
      }
    }

(Note that the argument to list.files() in the first line of code should be the path to the library directory for your previous R version, where all folders of packages in the previous version are. In my current case, this is "/Library/Frameworks/R.framework/Versions/3.2/Resources/library". This will be different if your previous R version is not 3.2, or if you're on Windows.)

The if statement makes sure that a package is not installed if

  • It's already installed in the new R version, or
  • Has been installed as a dependency from a package installed in a previous iteration of the for loop.
Nason answered 8/6, 2016 at 11:47 Comment(1)
This solved my issue, thanks! This question might sound a little dumb, but can I delete old libraries?Vaticination
H
4

Following Dirk's suggestion, here is some R code to do it on windows: How to easily upgrade R on windows XP

Update (15.04.11): I wrote another post on the subject, explaining how to deal with common issues of upgrading R on windows 7

Harker answered 23/4, 2010 at 22:50 Comment(2)
For the most recent versions of R, Tal has a package called installr which automates this process (currently only on Windows) r-statistics.com/tag/installr or github.com/talgalili/installrBiquadratic
Run Rgui.exe from C:\Program Files\R\R-3.6.0\bin\i386 and write the code to the console: install.packages(installr); library(installr); updateR(TRUE). At the end, [1] TRUE appears. By Galili's excellent package, I passed from R 3.6.0 to R 3.6.1 very easiliy. Thanks Tal.Caniff
L
2

Two options:

  1. Implement my answer here
  2. If you use R under Eclipse with StatET, open Run Configurations, click on Console tab and in the box called R snippet run after startup add this line with your choice of directory: .libPaths("C:/R/library")
Laurentian answered 15/7, 2011 at 15:37 Comment(0)
I
1

The accepted answer might work if you have foresight, but I had already gotten rid of the old version so wasn't able to follow these directions. The steps described below worked for OSX upgrading from 2.1 and 3.1.

UPDATED: To get the directory for your most recent version (instead of typing in 3.1 or 3.2) you can use the below commands. The second one converts directly to the R-variable, skipping . and .. and .DS_Store, use:

OLD=$(ls -d /Library/Frameworks/R.framework/Versions/*.* |tail -n 2 | head -n 1)Resources/library/
echo "packages = c(\"`ls $OLD | tail +4| paste -s -d ',' - | sed -E 's|,|\",\"|'g`\")" | tr -d "/" 

(Add |pbcopy to the end to copy it directly to your Mac clipboard)

Then within R you can paste that variable that is generated. Once that is defined in the new version of R, you can loop through the installed packages from the instructions above...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)
Isomerize answered 13/8, 2013 at 0:51 Comment(0)
R
1

I am on Windows 8 and for some weird reason, I can never install packages using my internet connections.

I generally install it using the .zip file from CRAN.

After I went from R 3.2.5 to R 3.3.1.

I simply copied the packages from

C:\Path\to\packa\R\win-library\3.2 to C:\Path\to\packa\R\win-library\3.3.

And then I restarted the R session. Worked perfectly. I haven't checked if ALL the packages are functioning well. But, the ones I checked are working perfectly well. Hope this hack works for everybody.

Cheers.

Rainger answered 27/8, 2016 at 18:3 Comment(0)
M
1

linux + bash + debian + apt users:

  1. If you're installing/upgrading to the newest version of R, then we may assume you have root permissions. (Not essential, just makes the process a lot simpler; for consistency the script below uses sudo for all installs.) As the R packages are also installed by root, it is thus permissible to place these in /usr/local/.

  2. The call to curl below assumes you are already interested in the sid release of R, the very latest unstable version (as required when building/checking an R package) i.e.

    cat /etc/apt/sources.list | grep 'sid' || exit 1

    although this could easily be replaced with a recent stable release e.g. buster.

  3. Note that I am not using a key as is typically recommended. This is not essential, particularly if (as in the script which follows) we install packages within R itself (Rscript -e below). Also, such keys have a tendency to break/change every few years. Thus, you are of course welcome to add the following preface to the file R.sh which follows:

    sudo apt-key adv --keyserver keyserver.ubuntu.com \ --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

  4. The array of R packages is clearly not exhaustive but gives some examples which I personally find useful. A fresh install/upgrade with the debian package r-recommended, as below, should give the latest version of all of the the standard 'recommended' packages (e.g. survival). I believe there may be a slight lag between a CRAN release and an update to the relevant debian package. Thus, you may wish to add some of these to the array below if having the latest version of a 'recommended' R package is essential.

  5. The debian packages installed in the process below are also neither essential (for using r-base) nor exhaustive but provide a no. of 'add-ons' which are important for a reasonable no. of R packages.

Anyway... place the following in R.sh:

sudo apt update && sudo apt --yes full-upgrade
sudo apt install --yes libappstream4 curl
### ov1 = online version; lv1 = local version (i.e. currently installed)
ov1=$(curl --silent --url https://packages.debian.org/sid/r-base |
    grep 'meta name=\"Keywords\"' |
    grep --only-matching '[0-9].*[0-9]') ; echo $ov1
## command -v = print a description of COMMAND similar to the `type' builtin
## && = if prior command succeeds, then do; || = if prior fails, then do
command -v 'R --version' &&
    lv1=$(R --version |
              grep --only-matching '[0-9\.]*[0-9]' |
              ## || = otherwise
              head -1) ||
        lv1=0
## 'lt' = less than
if dpkg --compare-versions "$lv1" 'lt' "$ov1" 
then ## declare -a = indexed array
     declare -a deb1=('r-base' 'r-base-dev' 'r-recommended')
     for i in "${deb1[@]}"
     do sudo apt install --yes "$i"
     done
fi
### certain Debian packages are required by 'R' so best have these first
sudo apt install --yes ccache libcairo2-dev libxml2-dev libcurl4-openssl-dev \
     libssl-dev liblapack-dev libssl-dev
declare -a pkg1=('data.table' 'ggplot2' 'knitr' 'devtools' 'roxygen2')
## installing as 'root' so these are installed in
Rscript -e ".libPaths()[1]"
for i in "${pkg1[@]}"
do sudo Rscript -e "install.packages('$i', dependencies=TRUE)"
done
### other useful additions
sudo apt install --yes libblas-dev libboost-dev libarmadillo-dev \
     jags pandoc pandoc-citeproc 
sudo apt update && sudo apt full-upgrade

Then execute it, e.g. assuming in directory already: source R.sh.

Installing packages (whether debian or R) one-by-one in a loop from shell is somewhat inefficient, but allows for simpler tracing of errors, IMHO. May take some time depending on the no. of R packages, so maybe simplest to let run overnight...

Misdate answered 7/5, 2019 at 7:9 Comment(2)
Not sure why 'survival' is in that list of supplementary packages. (And it's quite possible I'm misleading this bash script.) It's been a "recommended" packages since ... forever. If you are not installing all recommended packages with that script, it should be modified to do so. Also think that the r-base-devel set of packages would be needed for anyone using linux. And why not add the PPA of Michael Rutter?Staceystaci
Thank you! Updated in light of your helpful comments. Agree, no need routinely to install a package that's already in r-recommended. 'r-base-devel' is known as r-base-dev (debian package) - was already included. I'm not averse to using a key for security (answer updated). The answer stays away from using a PPA = Personal Package Archives as these are by necessity dependent on one person and thus potentially fallible. As Michael Rutter himself says (2012): "If you have been using CRAN, then there is no reason to change to the PPA, as the same packages are provided at both locations."Misdate
T
0

for me this page is good https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ or another option is just install the new option and at final you put, for example in windows in my pc

.libPaths(c( "D:/Documents/R/win-library/3.2", "C:/Program Files/R/R-3.2.3/library", "C:/Program Files/R/R-3.2.0/library", "D:/Documents/R/win-library/2.15" )

every path of last version in my case i always put the first path is "D:/Documents/R/win-library/3.2" that is fixed and then i put the other because you do not need copy or move any packages, in my sugest just call it

Tread answered 8/2, 2016 at 22:12 Comment(0)
D
0

In linux, Now it is very simple. Just make:

install.packages("ropenblas")
ropenblas::rcompiler()
Dabney answered 17/12, 2020 at 15:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.