代码之家  ›  专栏  ›  技术社区  ›  Shane

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

  •  141
  • Shane  · 技术社区  · 16 年前

    Andrew Gelman recently lamented the lack of an easy upgrade process for 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)
    
    10 回复  |  直到 8 年前
        1
  •  67
  •   CptNemo    11 年前

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

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

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

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

    这会将此路径作为 图书馆 变量,并将其设为默认值。

    如果您想进一步自动化这个过程,可以在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])
    }
    

    我通过指定 .Last() 在我的rprofile.site中。这将更新包列表,如果我安装了:

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

    当我安装一个新的R版本时,我只是将必要的元素添加到rprofile.site文件中,然后重新安装所有包。无论如何,我必须调整rprofile.site(使用sum-contrasts,为tinn-r添加额外的代码,这些东西),所以它不是真正的额外工作。重新安装所有软件包只需要额外的时间。

    最后一位相当于原始问题中给出的解。我只是不需要担心先得到“已安装”列表。

    同样,如果您的软件包不是从Cran安装的,那么它也不会毫无瑕疵地工作。但是这个代码也很容易扩展到包含那些代码。

    编辑:代码中缺少括号

        2
  •  33
  •   Alf Pascu SJDS    8 年前

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

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

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

    More info on {installr} here .

    西蒙

        3
  •  26
  •   mindless.panda    14 年前

    两个快速建议:

    1. 使用Gabor batchfiles 据说它包含了一些工具,例如,这个批量库的重新定位。警告:我没有用过。

    2. 不要在已安装的R版本的“filetree”中安装库。在Windows上,我可以将r放在c:/opt/r/r-$version中,但将所有库放在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"
    
        4
  •  22
  •   user3652621    9 年前

    如果您的包不是来自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
  •  6
  •   Raffaele Vacca    10 年前

    关于问题中给出的解决方案,如果已经安装了新版本,那么运行旧版本的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
  •  3
  •   Tal Galili    15 年前

    按照Dirk的建议,下面是一些在Windows上执行此操作的R代码: How to easily upgrade R on windows XP

    更新(15.04.11):我写了另一篇关于这个主题的文章,解释了如何处理 upgrading R on windows 7

        7
  •  2
  •   Community Mohan Dere    9 年前

    两种选择:

    1. 实现我的答案 here
    2. 如果您在Eclipse和Statet下使用r,则打开 运行配置 ,点击 慰问 选项卡和框中的 启动后运行r代码段 用您选择的目录添加此行: .libPaths("C:/R/library")
        8
  •  1
  •   Roman    9 年前

    我在Windows8上,出于某种奇怪的原因,我永远无法使用Internet连接安装软件包。

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

    从R 3.2.5到R 3.3.1之后。

    我只是从

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

    然后我重新启动了R会话。工作得很好。 我还没有检查所有的包裹是否都能正常工作。 但是,我检查的那些工作得很好。 希望这个黑客对每个人都有用。

    干杯。

        9
  •  1
  •   beroe    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 "/"
    

    然后在 R 可以粘贴生成的变量(添加 |pbcopy 最后直接复制。一旦在新版本的R中定义了它,您就可以从上面的说明循环访问已安装的包…

    for (p in setdiff(packages, installed.packages()[,"Package"]))
       install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)
    
        10
  •  0
  •   juanprimate    9 年前

    对我来说这页不错 https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ 或 另一个选项是安装新的选项,最后,例如在“我的电脑”的Windows中

    LBYPATH(C) “d:/documents/r/win库/3.2”, “C:/程序文件/R/R-3.2.3/库”, “C:/程序文件/R/R-3.2.0/库”, “d:/documents/r/win库/2.15” )

    在我的例子中,最后一个版本的每一条路径我总是放在第一条路径是“d:/documents/r/win library/3.2”,它是固定的。 然后我把另一个放在我的建议里,因为你不需要复制或移动任何包裹。