【问题标题】:Painless way to install a new version of R?安装新版本 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)

【问题讨论】:

标签: r upgrade packages


【解决方案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】:

两个快速建议:

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

  2. 不要在已安装 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):

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

【讨论】:

    【解决方案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/installrgithub.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】:

    两种选择:

    1. 实施我的回答here
    2. 如果你在 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 用户:

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

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

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

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

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

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

            4. Rarray 显然并不详尽,但提供了一些我个人认为有用的示例。使用debianr-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

            安装包(无论是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()
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-10-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多