Painless way to install a new version of R?

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)
65006 次浏览

两个快速建议:

  1. 使用 Gabor 的 批处理文件,据说这些 批处理文件包含了一些工具,例如这个大容量库的重新定位。注意: 我没有用过它们。

  2. 不要在已安装的 R 版本的“文件树”中安装库。在 Windows 上,我可以把 R 放到 C:/opt/R/R-$版本中,但是把所有的库放到 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"

如果您有不是来自 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()

按照 Dirk 的建议,这里有一些 R 代码可以在窗口上实现: 如何在 Windows XP 上轻松升级 R

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

为了完整起见,有一些方法可以防止您遇到这个问题。正如 Dirk 所说,将包保存在计算机上的另一个目录中。

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

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

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

这将把此路径作为 .Library变量中的第一个值,并使其成为默认值。

如果希望进一步自动化,可以在 Rprofile.site 文件中指定,该文件位于 R 构建的/etc/目录中。然后,每次 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])
}

我通过在我的 Rprofile.site 中指定 .Last()来生成 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 安装的软件包,那么这种方法也不能完美无缺地工作。但是这些代码也很容易扩展以包含这些代码。

两个选择:

  1. 执行我的答案 给你
  2. 如果在 Eclipse 和 StatET 下使用 R,打开 运行配置,单击 控制台选项卡,然后在名为 启动后运行 R 代码片段的框中添加这一行,并选择目录: .libPaths("C:/R/library")

如果你有远见的话,这个被接受的答案可能会有用,但是我已经摆脱了旧版本,所以不能遵循这些方向。 下面描述的步骤适用于从2.1和3.1升级的 OSX。

更新: 要获取最新版本的目录(而不是键入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)

如果使用 Windows,可能需要使用 安装包:

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

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

更多关于 安装的信息请点击这里。

对我来说,这一页是好的 Https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ 或者 另一个选项是只安装新的选项,并在最后你把,例如在我的电脑的窗口

. libPath (c ( “ D:/Document/R/win-library/3.2” “ C:/Program Files/R/R-3.2.3/library”, “ C:/Program Files/R/R-3.2.0/library”, D:/Document/R/win-library/2.15 )

在我的例子中,上一个版本的每个路径我总是把第一个路径是“ D:/Document/R/win-library/3.2”,它是固定的 然后我把另一个,因为你不需要复制或移动任何包,在我的建议只是调用它

关于问题中给出的解决方案,如果您已经安装了新版本,那么运行旧版本的 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()的参数应该是前一个 R 版本的库目录的路径,其中包的所有文件夹都在前一个版本中。在我目前的案例中,这是 "/Library/Frameworks/R.framework/Versions/3.2/Resources/library"。如果你以前的 R 版本不是3.2,或者你使用的是 Windows 系统,这将是不同的。)

if语句确保包是在以下情况下安装的 没有

  • 它已经安装在新的 R 版本中,或者
  • 已作为依赖项安装在 for循环的上一次迭代中安装的包中。

我使用的是 Windows8系统,由于某些奇怪的原因,我永远不能使用我的互联网连接安装软件包。

我通常使用来自 CRAN 的. zip 文件来安装它。

在我从 R3.2.5到 R3.3.1之后。

我只是复制了

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

然后我重新开始了 R 疗程,效果很好。 我还没有检查是否所有的软件包都运行良好。 但是,我检查过的那些都很好用。 希望这招对大家都管用。

干杯。

linux + bash + debian + apt用户:

  1. 如果您正在安装/升级到最新版本的 R,那么我们可以假设您拥有 root权限。(不是必要的,只是使过程简单得多; 为了保持一致性,下面的脚本使用 sudo进行 所有安装。) 由于 R软件包也是由 root安装的,因此允许将这些软件包放在 /usr/local/中。

  2. 以下对 curl的呼叫假设您已经对 Rsid版本感兴趣,R是最新的 情绪不稳定版本(在构建/检查 R软件包时需要这样做) ,即。

    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. Rarray显然不是详尽无遗的,但是给出了一些我个人认为有用的例子。使用 debian软件包 r-recommended进行新的安装/升级(如下所示) ,应该能够提供所有标准的“推荐”软件包(例如 survival)的最新版本。我相信在 CRAN 发布和相关 debian包的更新之间可能会有一点延迟。因此,如果有一个“推荐的”R软件包的最新版本是必不可少的,您可能希望在下面的 array中添加一些这样的软件包。

  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) 一个接一个有些低效,但是允许更简单的错误跟踪,IMHO。可能需要一些时间,取决于没有。的 R包,所以也许最简单的让运行过夜..。

在 linux 中,现在它非常简单,只需要:

install.packages("ropenblas")
ropenblas::rcompiler()