无痛方式安装新版本的R?


158

最近,安德鲁·盖尔曼(Andrew Gelman)对R缺乏便捷的升级过程感到遗憾R在Windows上比Linux更为重要)。从安装软件到复制所有设置/软件包,是否有人有进行升级的好技巧?

该建议包含在评论中,这是我最近一直在使用的建议。首先,您安装新版本,然后在旧版本中运行它:

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

随后在新版本中:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)

1
这里使用的解决方案是最新的吗?
2014年

我最近用过,效果很好。
利沃兹

Answers:


74

仅出于完整性考虑,有一些方法可以防止出现此问题。如Dirk所说,将软件包保存在计算机上的另一个目录中。

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

您可以更改默认.Library使用的函数值.libPaths

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

这会将路径作为.Library变量的第一个值,并将其作为默认值。

如果要进一步自动执行此操作,可以在Rprofile的/ etc /目录中的Rprofile.site文件中指定它。然后,它将在每次加载R时自动加载,您不必再为此担心。您可以只从指定目录安装和加载软件包。

最后,我在Rprofile.site中包含一些小代码,允许我在安装新的R版本时重新安装所有软件包。您只需要列出它们,然后再更新到新的R版本。我使用包含所有软件包的更新列表的.RData文件来执行此操作。

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

我通过.Last()在Rprofile.site中指定来创建packagelist.RData 。如果我安装了一些软件包,这将更新软件包列表:

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

当我安装新的R版本时,只需将必要的元素添加到Rprofile.site文件中,然后重新安装所有软件包。无论如何,我都必须调整Rprofile.site(使用总和,为Tinn-R添加额外的代码,这些事情),所以这并不是真正的额外工作。重新安装所有软件包只需要花费额外的时间。

最后一点等同于原始问题中给出的解决方案。我只是不需要担心首先获得“已安装”列表。

同样,如果您没有从CRAN安装的软件包,这将无法正常工作。但是此代码也很容易扩展以包括这些代码。


2
@Prasad:谢谢。答案是,R 2.12有点过时,并且进一步自动将您自己安装的软件包保存在主R树之外的标准库中。因此,现在要做的就是确保找到该库并链接到该库,如果这不是自己发生的。
Joris Meys 2011年

@ 428790:在哪里可以找到您提到的库?
Daniel Krizian

@DanielKrizian查看内部对象中的默认对象.Library。就我而言,它指向R安装文件夹,如果未更改(我特别不喜欢,但是很好)
Joris Meys 2013年

42

这当然是一个古老的问题,但是我刚刚发现了一个新的简单答案(仅适用于Windows)。

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

最好的方法是从RGui系统。您所有的软件包都将被转移到新文件夹,而旧的软件包将被删除或保存(您可以选择其中一个)。然后,再次打开RStudio后,它会立即识别出您正在使用更新的版本。对我来说,这就像一种魅力,

有关{installr}的更多信息,请参见此处

西蒙


2
通过github安装的软件包呢?
skan 2016年

8
应该提到的是,这是针对Windows的。
beroe

27

两个快速建议:

  1. 使用Gabor的批处理文件,据说该批处理文件包含有助于批量存储库重定位的工具。警告:我没有使用过它们。

  2. 不要在已安装的R版本的“文件树”中安装库。在Windows上,我可以将R放入C:/ opt / R / R- $ version,但使用以下代码片段将所有库放入C:/ opt / R / library /,因为这首先可以缓解问题:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"

我想知道将软件包从R 2.8传输到R.9是否会引起任何问题?还是只要您在新版本中执行update.packages就可以了吗?
Eduardo Leoni

我这样做已经有一段时间了,没有遇到任何问题。R通常是“前向兼容”的。而IIRC只需一次升级(可能是R 1.9-> R 2.0)即可重建所有库。
Dirk Eddelbuettel 09年

5
我通常也只将我的Library文件夹复制到我的新安装中,然后运行update.packages。它似乎工作正常。但是,可选的安装文件夹更加优雅。
kpierce8

只是指出-我添加了一个答案,其中包含执行Dirk的建议的R代码(适用于R Windows用户)
Tal Galili

26

如果您有非CRAN的软件包,则上面建议的方法将无法完全起作用。例如,个人软件包或从非CRAN站点下载的软件包。

我在Windows上的首选方法(将2.10.1升级到2.11.0):

  1. 安装R-2.11.0
  2. 复制R-2.10.0/library/*R-2.11.0/library/
  3. 在提示您回答是否可以覆盖时,对提示回答“否”。
  4. 开始R 2.11.0
  5. 运行R命令 update.packages()

7

关于问题中给出的解决方案,如果您已经安装了新版本的R,运行旧版本的R可能并不容易。在这种情况下,您仍然可以按照以下步骤重新安装先前R版本中所有缺少的软件包。

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

(请注意,list.files()代码第一行中的参数to 应该是您先前R版本的库目录的路径,其中先前版本中所有软件包的文件夹都在其中。在我当前的情况下,这是"/Library/Frameworks/R.framework/Versions/3.2/Resources/library"。如果您先前的R版本不是3.2,或者您使用的是Windows。)

if语句确保在以下情况下安装软件包

  • 它已经安装在新的R版本中,或者
  • 已作为依赖项从for循环的先前迭代中安装的软件包中安装。

这解决了我的问题,谢谢!这个问题听起来有些愚蠢,但是我可以删除旧库吗?
m_c

4

根据Dirk的建议,以下是一些在Windows上执行的R代码: 如何在Windows XP上轻松升级R

更新(15.04.11):我写了另一篇有关该主题的文章,解释了如何处理在Windows 7上升级R的常见问题


2
对于R的最新版本,Tal有一个名为的软件包installr,可以自动执行此过程(当前仅在Windows上)r-statistics.com/tag/installrgithub.com/talgalili/installr
Louis Maddox

1
从C:\ Program Files \ R \ R-3.6.0 \ bin \ i386运行Rgui.exe并将代码写入控制台:install.packages(installr); library(installr); updateR(TRUE)。最后[1] TRUE出现。通过Galili的出色软件包,我非常容易地从R 3.6.0转到R 3.6.1。谢谢塔尔。
Erdogan CEVHER

2

两种选择:

  1. 在这里实施我的答案
  2. 如果您在带有StatET的Eclipse下使用R,请打开“运行配置”,单击“ 控制台”选项卡,然后在启动后运行的名为“ R片段运行”的框中添加以下行并选择目录:.libPaths("C:/R/library")

1

我使用的是Windows 8,出于某些奇怪的原因,我永远无法使用Internet连接安装软件包。

我通常使用CRAN的.zip文件进行安装。

从R 3.2.5转到R 3.3.1之后。

我只是从复制了软件包

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

然后,我重新启动了R会话。工作完美。我没有检查所有软件包是否运行良好。但是,我检查的那些工具运行良好。希望此技巧适用于所有人。

干杯。


1

如果您有远见,可以接受已接受的答案,但是我已经摆脱了旧版本,因此无法遵循这些指示。下述步骤适用于OSX从2.1和3.1升级。

更新:要获取最新版本的目录(而不是输入3.1或3.2),可以使用以下命令。直接在第二个转换为R-变量,跳过....DS_Store,使用:

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 "/" 

(添加|pbcopy到最后直接将其复制到Mac剪贴板中)

然后,您可以在R中粘贴所生成的变量。一旦在新版本的R中定义了它,您就可以按照上述说明循环浏览已安装的软件包...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)

0

对我来说,此页面很好 https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ 或其他选择只是安装新的选项,最后放到您的电脑上,例如在Windows中

.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”)

在我的情况下,最后一个版本的每个路径我始终都将第一个路径固定为“ D:/Documents/R/win-library/3.2”,然后我将另一个放置,因为您不需要复制或移动任何软件包,我的名字叫它


0

linux+ bash+ debian+ apt用户:

  1. 如果您要安装/升级到的最新版本R,则我们可能会假设您具有root权限。(不是必需的,只是使过程变得简单得多;为了保持一致性,下面的脚本sudo用于所有安装。)由于R软件包也是由安装的root,因此可以将它们放置在中/usr/local/

  2. 下面的调用curl假定您已经对最新的不稳定版本(根据构建/检查软件包的要求)的sid发布感兴趣,例如RR

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

    尽管可以很容易地用最近稳定的版本代替,例如buster

  3. 请注意,我使用钥匙一般建议。这不是必需的,尤其是(如下面的脚本中)我们 R内部安装软件包时(Rscript -e如下所示)。而且,这样的密钥每隔几年就会断裂/改变。因此,当然欢迎您在以下文件中添加以下序言R.sh

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

  4. arrayR显然不是全部,但给出了一些例子,我个人觉得非常有用。如下所示,使用该debian软件包进行全新的安装/升级r-recommended应提供所有标准“推荐”软件包(例如survival)的最新版本。我相信CRAN版本与相关debian软件包的更新之间可能会略有滞后。因此,array如果必须具有最新版本的“推荐” R软件包,则不妨在其中添加以下内容。

  5. 以下过程中安装的debian软件包也不是必不可少的(使用r-base),也不是详尽无遗的,但是没有提供。对于“合理”数量而言很重要的“附加组件” 的R包。

无论如何...将以下内容放入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

然后执行它,例如假设已经在目录中:source R.sh

从shell循环一个接一个地安装软件包(无论是debian还是R)效率不高,但是允许更简单地跟踪错误,恕我直言。可能需要一些时间,具体取决于否。的包,所以也许最简单,让通宵运行...R


1
不知道为什么“生存”在补充包装清单中。(而且很可能我误导了该bash脚本。)自从……一直以来,它一直是“推荐”软件包。如果您没有使用该脚本安装所有推荐的软件包,则应对其进行修改以进行安装。还认为使用rlinux的任何人都需要r-base-devel软件包集。为什么不添加Michael Rutter的PPA?
IRTFM '19

谢谢!根据您的有用评论进行了更新。同意,无需常规安装已经存在的软件包r-recommended。'r-base-devel'被称为r-base-devdebian包)-已包含在内。我不反对使用密钥来确保安全性(答案已更新)。答案远离使用PPA= 个人包装档案,因为这些档案必须依赖于一个人,因此可能会出错。正如Michael Rutter自己(2012)所说:“如果您一直在使用CRAN,则没有理由更改PPA,因为两个位置都提供了相同的软件包。”
dardisco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.