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

Posted

技术标签:

【中文标题】安装新版本 R 的无痛方式?【英文标题】:Painless way to install a new version of R? 【发布时间】:2010-11-26 23:28:38 【问题描述】:

Andrew Gelman recently lamented the lack of an easy upgrade process for R(在 Windows 上可能比在 Linux 上更相关)。从安装软件到复制所有设置/包,是否有人有一个很好的升级技巧?

这个建议包含在 cmets 中,也是我最近一直在使用的。首先安装新版本,然后在旧版本中运行:

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

【问题讨论】:

这里使用的解决方案的最新程度如何? 我最近用过,效果很好。 ***.com/questions/13656699/update-r-using-rstudio 【参考方案1】:

为了完整起见,有一些方法可以防止您遇到此问题。正如 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 安装的,这将无法完美运行。但是这段代码很容易扩展以包含这些代码。

【讨论】:

@Prasad:谢谢。答案有点过时了,R 2.12 并进一步自动将您自己安装的包保存在主 R 树之外的标准库中的某个位置。所以你现在要做的就是确保你找到那个库并链接到它,如果这不是自己发生的。 @428790:我在哪里可以找到你提到的那个库? @DanielKrizian 查看内部对象.Library中的默认值。就我而言,如果未更改,它会指向 R 安装文件夹(我特别不喜欢,但很好)【参考方案2】:

如果您使用的是 Windows,您可能需要使用 installr 软件包:

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

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

More info on installr here.

【讨论】:

通过github安装的包呢? 需要说明的是,这是针对Windows的。【参考方案3】:

两个快速建议:

    使用 Gabor 的 batchfiles,据说它包含帮助例如此批量库重定位。警告:我没有使用它们。

    不要在已安装 R 版本的“文件树”中安装库。在 Windows 上,我可以将 R 放入 C:/opt/R/R-$version 但使用以下 sn-p 将所有库放入 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 就一切都好? 我这样做已经有一段时间了,没有遇到任何问题。 R 通常是“向前兼容的”。而 IIRC 只有一次升级(可能是 R 1.9 -> R 2.0)需要重建所有库。 我通常也只是将我的库文件夹复制到我的新安装并运行 update.packages。它似乎工作正常。然而,可选的安装文件夹更加优雅。 只是指出 - 我已经添加了一个答案,R 代码执行 Dirk 的建议(适用于 R windows 用户)【参考方案4】:

如果您有不是来自 CRAN 的软件包,上述建议的方法将无法完全工作。例如,个人包或从非 CRAN 站点下载的包。

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

    安装 R-2.11.0 复制R-2.10.0/library/*R-2.11.0/library/ 对询问您是否可以覆盖的提示回答“否”。 启动 R 2.11.0 运行R命令update.packages()

【讨论】:

【参考方案5】:

关于问题中给出的解决方案,如果您已经安装了新版本,运行旧版本的 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 循环迭代中安装的包中。

【讨论】:

这解决了我的问题,谢谢!这个问题可能听起来有点傻,但是我可以删除旧库吗?【参考方案6】:

按照 Dirk 的建议,这里有一些 R 代码可以在 Windows 上执行此操作:How to easily upgrade R on windows XP

更新(15.04.11):我写了一篇关于这个主题的帖子,解释了如何处理upgrading R on windows 7的常见问题

【讨论】:

对于最新版本的 R,Tal 有一个名为 installr 的包,它可以自动执行此过程(目前仅在 Windows 上)r-statistics.com/tag/installr 或 github.com/talgalili/installr 从 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。谢谢塔尔。【参考方案7】:

两种选择:

    实施我的回答here 如果你在 Eclipse 下使用 R 和 StatET,打开 Run Configurations,点击 Console 选项卡并在名为 R sn-p run after startup 在您选择的目录中添加这一行:.libPaths("C:/R/library")

【讨论】:

【参考方案8】:

我在 Windows 8 上,由于某些奇怪的原因,我永远无法使用我的互联网连接安装软件包。

我通常使用 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 会话。工作完美。 我还没有检查是否所有的包都运行良好。 但是,我检查的那些工作得很好。 希望这个技巧适用于所有人。

干杯。

【讨论】:

【参考方案9】:

如果您有远见,接受的答案可能会起作用,但我已经摆脱了旧版本,因此无法遵循这些指示。 下面描述的步骤适用于从 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)

【讨论】:

【参考方案10】:

对我来说这个页面很好 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” 然后我放了另一个,因为您不需要复制或移动任何包,在我的建议中只需调用它

【讨论】:

【参考方案11】:

linux + bash + debian + apt 用户:

    如果您要安装/升级到最新版本的 R,那么我们可能会假设您拥有 root 权限。 (不是必需的,只是使过程更简单;为了保持一致性,下面的脚本使用sudo 进行all 安装。) 由于R 包也由root 安装,因此可以将它们放在/usr/local/ 中。

    下面对curl 的调用假定您已经对Rsid 版本感兴趣,这是最新的不稳定 版本(在构建/检查R 包时需要) 即

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

    虽然这可以很容易地用最近的稳定版本替换,例如buster

    请注意,我没有像typically recommended那样使用key。这不是必需的,特别是如果(如下面的脚本中)我们在R 本身(下面的Rscript -e)安装包within。此外,此类密钥往往每隔几年就会损坏/更换。因此,当然欢迎您在文件R.sh 中添加以下前言:

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

    Rarray 显然并不详尽,但提供了一些我个人认为有用的示例。使用debianr-recommended 进行全新安装/升级,如下所示,应该提供所有标准“推荐”包的最新版本(例如survival)。我相信 CRAN 版本和相关debian 包的更新之间可能会有一点延迟。因此,如果必须拥有最新版本的“推荐”R 软件包,您可能希望将其中的一些添加到下面的 array

    在下面的过程中安装的 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

安装包(无论是debian 还是R一个接一个 在shell 的循环中有点低效,但允许更简单地跟踪错误,恕我直言。可能需要一些时间,具体取决于否。的R 包,所以可能最简单的方法是让它在一夜之间运行......

【讨论】:

不确定为什么“生存”出现在补充包列表中。 (很可能我误导了这个 bash 脚本。)它一直是“推荐”的包,因为......永远。如果您没有使用该脚本安装所有推荐的软件包,则应该对其进行修改。还认为任何使用 linux 的人都需要 r-base-devel 包集。为什么不添加 Michael Rutter 的 PPA? 谢谢!根据您有用的 cmets 进行更新。同意,不需要经常安装已经在r-recommended 中的软件包。 'r-base-devel' 被称为 r-base-devdebian 包) - 已经包含在内。我不反对使用安全密钥(答案已更新)。答案远离使用PPA = Personal Package Archives,因为它们必然依赖于一个人,因此可能会出错。正如 Michael Rutter 本人所说(2012 年):“如果您一直在使用 CRAN,那么没有理由更改为 PPA,因为在两个位置都提供了相同的软件包。”【参考方案12】:

在linux中,现在很简单。只需制作:

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

【讨论】:

以上是关于安装新版本 R 的无痛方式?的主要内容,如果未能解决你的问题,请参考以下文章

带有 rstudio 的新版本 R

centos 较新版本kernel安装方法

彻底删除旧版本mysql并安装新版本

安卓手机app如何旧版本覆盖新版本,不用卸载且不删数据?

解决Mac下安装新版本IDEA无法启动

用于设置自定义变量的谷歌分析新版本