无痛的方式来安装新版本的R?
Andrew Gelman最近感叹缺乏一个简单的R升级过程 (可能在Windows上比Linux更相关)。 有没有人有做好升级的好方法,从安装软件到复制所有设置/软件包?
这个build议包含在评论中,是我最近使用的。 首先安装新版本,然后在旧版本中运行:
#--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)
只是为了完整性,有一些方法可以防止你遇到这个问题。 正如德克所说,保存你的软件包在另一个目录在你的电脑上。
install.packages("thepackage",lib="/path/to/directory/with/libraries")
您可以使用函数.libPaths
更改默认的.libPaths
值
.libPaths("/path/to/directory/with/libraries")
这将把这个path作为.Library
variables的第一个值,并将它作为默认值。
如果你想进一步自动化,你可以在Rprofile.site文件中指定它,你可以在你的R版本的/ etc /目录下find它。 然后它会在每次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安装的,那么这种方法并不完美。 但是这个代码很容易扩展到包含这些代码。
编辑:代码中有一个缺less的括号
这当然是一个老问题,但是我可以find一个新的简单答案。
install.packages("installr") require(installr) updateR()
做这个最好的方法是从RGUI系统。 所有的包将被转移到新的文件夹,旧的将被删除或保存(你可以select)。 然后,一旦您再次打开RStudio,它会立即识别出您正在使用更新的版本。 对我来说,这就像一个魅力,
更多关于{installr}的信息 。
西蒙
两个简单的build议:
-
使用Gabor的batch file ,据说这些文件包含了帮助这个批量库重定位的工具。 警告:我没有用过它们。
-
不要在安装的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"
上面build议的方法不能完全工作,如果你有不是来自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()
就问题中给出的解决scheme而言,如果您已经安装了新版本,运行旧版本的R可能并不容易。 在这种情况下,您仍然可以按照以下方式重新安装以前R版本的所有缺less的软件包。
# 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版本的库目录的path,其中前一版本中的所有软件包都是。在我目前的情况下,这是"/Library/Frameworks/R.framework/Versions/3.2/Resources/library"
如果你之前的R版本不是3.2,或者你在Windows上,这将是不同的。)
if
语句确保程序包未安装
- 它已经安装在新的R版本中,或者
- 已经作为
for
循环的先前迭代中安装的程序包的依赖项安装。
遵循德克的build议,这里是一些R代码在Windows上做到这一点: 如何在Windows XP上轻松升级R.
更新(15.04.11):我写了一篇关于这个主题的文章,解释了如何处理在Windows 7上升级R的常见问题
两个选项:
- 在这里实现我的答案
- 如果你在Eclipse下使用R和StatET,打开Run Configurations ,点击Console选项卡,然后在启动后的R snippet运行框中添加下面这行代码 :
.libPaths("C:/R/library")
我在Windows 8上,出于一些奇怪的原因,我不能使用我的互联网连接安装软件包。
我通常使用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会话。 完美的工作。 我没有检查是否所有的软件包运行良好。 但是,我检查的工作非常好。 希望这个黑客适用于每个人。
干杯。
如果你有先见之明,接受的答案可能会奏效,但我已经摆脱了旧版本,所以无法遵循这些方向。 下面描述的步骤适用于从2.1和3.1的OSX升级。
更新:要获得您的上一个版本的目录(而不是键入3.1或3.2),您可以使用下面的命令。 第二个直接转换为Rvariables,跳过.
和.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中你可以粘贴生成的variables(添加|pbcopy
到最后直接复制它,一旦在R的新版本中定义了,你可以从上面的指令中循环安装的软件包…
for (p in setdiff(packages, installed.packages()[,"Package"])) install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)
.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“)
在我的情况下,最后一个版本的每一个path,我总是把第一个path是“D:/Documents/R/win-library/3.2”是固定的,然后我把另一个,因为你不需要复制或移动任何包,在我的sugest只是叫它