Andrew Gelman 最近对 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)
有帮助吗?

解决方案

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

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

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

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

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

如果要进一步自动化,可以在Rprofile.site文件中指定它,您可以在R build的/ etc /目录中找到它。然后每次加载时它都会自动加载,你不必再担心了。您只需从指定目录安装和加载包即可。

最后,我的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安装,则无法完美运行。但是这个代码很容易扩展,包括那些代码。

其他提示

这当然是一个老问题,但我可能会找到一个新的简单答案(仅适用于Windows)。

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

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

有关{installr}的更多信息

西蒙

两个快速建议:

  1. 使用Gabor的批量文件,据说这些文件包含有助于解决问题的工具。这个批量库重定位。警告:我没有使用它们。

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

  3. $ 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()

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

遵循Dirk的建议,这里有一些R代码在Windows上执行:如何在Windows XP上轻松升级R

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

两个选项:

  1. 实施我的回答此处
  2. 如果您在Eclipse下使用R和StatET,请打开运行配置,单击控制台选项卡,然后在启动后名为 R片段运行的框中使用您选择的目录添加此行: .libPaths(&quot; C:/ R / library&quot;)

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

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

从R 3.2.5到R 3.3.1。

我只是从

复制了包

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

然后我重新启动了R会话。工作得很完美。 我没有检查是否所有包都运行良好。 但是,我检查的那些工作得非常好。 希望这个黑客适用于所有人。

干杯。

如果你有先见之明,接受的答案可能会有效,但我已经摆脱了旧版本,所以无法按照这些指示行事。 下面描述的步骤适用于从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)

对我来说这个页面很好 https ://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ 要么 另一种选择就是安装新选项,最后你可以放置,例如在我的电脑的窗口中

.libPaths(C( &QUOT; 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”, &QUOT; d:/Documents/R/win-library/2.15" )

在我的案例的最后一个版本的每个路径我总是把第一个路径是“D:/Documents/R/win-library/3.2"这是固定的 然后我把另一个因为你不需要复制或移动任何包,在我的sugest中只是称之为

linux + bash + debian + apt 用户:

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

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

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

    虽然这很容易被最近的稳定版本取代,例如<代码>克星

  3. 请注意,我使用,因为通常建议使用。这不是必需的,特别是如果(如下面的脚本中)我们在 R 本身(下面的 Rscript -e )中安装包。而且,这种键每隔几年就有破坏/变化的趋势。因此,您当然欢迎将以下前言添加到以下文件 R.sh 中:

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

  4. R 软件包数组显然不是详尽无遗的,但提供了一些我认为有用的示例。使用 debian 包进行全新安装/升级 r-recommended ,如下所示,应该提供所有标准“推荐”软件包的最新版本(例如 survival )。我相信CRAN版本与相关 debian 包的更新之间可能存在轻微的延迟。因此,如果必须使用最新版本的“推荐” R 包,您可能希望将其中一些添加到 array 中。

  5. 以下流程中安装的 debian 软件包也不是必需的(使用 r-base ),也不是详尽无遗的不。 '附加组件'对于合理的号码很重要。 R 包。

  6. 无论如何......将以下内容放在 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 包,所以也许最简单的让我们一夜之间运行......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top