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

Sha*_*ane 151 packages r upgrade

安德鲁·格尔曼(Andrew Gelman)最近对R缺乏一个简单的升级过程感到遗憾(可能在Windows上比Linux更相关).有没有人有一个很好的技巧来进行升级,从安装软件到复制所有设置/包?

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

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

在新版本中遵循以下内容:

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

Jor*_*eys 72

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

install.packages("thepackage",lib="/path/to/directory/with/libraries")
Run Code Online (Sandbox Code Playgroud)

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

.libPaths("/path/to/directory/with/libraries")
Run Code Online (Sandbox Code Playgroud)

这会将此路径作为.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])
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

最后一位等同于原始问题中给出的解决方案.我不需要担心首先获得"已安装"列表.

同样,如果您的软件包未从CRAN安装,则无法完美运行.但是这个代码很容易扩展,包括那些代码.

编辑:代码中缺少括号

  • @Prasad:谢谢.答案有点过时,R 2.12并进一步自动保存您自己安装在主R树外的标准库中的软件包.因此,您现在要做的就是确保找到该库并链接到它,如果这不是自己发生的话. (2认同)

SJD*_*JDS 38

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

install.packages("installr")
require(installr)
updateR()
Run Code Online (Sandbox Code Playgroud)

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

有关{installr}的更多信息,请点击此处.

西蒙

  • 应该提到的是,这适用于Windows. (6认同)
  • 通过github安装的软件包呢? (2认同)

Dir*_*tel 27

两个快速建议:

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

  2. 不要在已安装的R版本的"filetree"中安装库.在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"
Run Code Online (Sandbox Code Playgroud)

  • 我通常只是将我的Library文件夹复制到我的新安装并运行update.packages.它似乎工作正常.然而,可选的安装文件夹更加优雅. (5认同)

Kev*_*ght 24

如果您的软件包不是来自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()

  • 或者`update.packages(checkBuilt = TRUE,ask = FALSE)`:-P (24认同)

小智 7

关于问题中给出的解决方案,如果您已经安装了新版本,则运行旧版本的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) 
      }
    }
Run Code Online (Sandbox Code Playgroud)

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

if语句确保如果没有安装包

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