安装新版本 R 的无痛方式?
Posted
技术标签:
【中文标题】安装新版本 R 的无痛方式?【英文标题】:Painless way to install a new version of 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)
【问题讨论】:
这里使用的解决方案的最新程度如何? 我最近用过,效果很好。 ***.com/questions/13656699/update-r-using-rstudio 【参考方案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】:两个快速建议:
使用 Gabor 的 batchfiles,据说它包含帮助例如此批量库重定位。警告:我没有使用它们。
不要在已安装 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):
-
安装 R-2.11.0
复制
R-2.10.0/library/*
到R-2.11.0/library/
对询问您是否可以覆盖的提示回答“否”。
启动 R 2.11.0
运行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
语句确保一个包没有安装如果
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/installr 或 github.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】:
两种选择:
-
实施我的回答here
如果你在 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.2
到 C:\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
用户:
如果您要安装/升级到最新版本的 R
,那么我们可能会假设您拥有 root
权限。 (不是必需的,只是使过程更简单;为了保持一致性,下面的脚本使用sudo
进行all 安装。)
由于R
包也由root
安装,因此可以将它们放在/usr/local/
中。
下面对curl
的调用假定您已经对R
的sid
版本感兴趣,这是最新的不稳定 版本(在构建/检查R
包时需要) 即
cat /etc/apt/sources.list | grep 'sid' || exit 1
虽然这可以很容易地用最近的稳定版本替换,例如buster
。
请注意,我没有像typically recommended那样使用key。这不是必需的,特别是如果(如下面的脚本中)我们在R
本身(下面的Rscript -e
)安装包within。此外,此类密钥往往每隔几年就会损坏/更换。因此,当然欢迎您在文件R.sh
中添加以下前言:
sudo apt-key adv --keyserver keyserver.ubuntu.com \
--recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
R
包 的array
显然并不详尽,但提供了一些我个人认为有用的示例。使用debian
包r-recommended
进行全新安装/升级,如下所示,应该提供所有标准“推荐”包的最新版本(例如survival
)。我相信 CRAN 版本和相关debian
包的更新之间可能会有一点延迟。因此,如果必须拥有最新版本的“推荐”R
软件包,您可能希望将其中的一些添加到下面的 array
。
在下面的过程中安装的 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-dev
(debian
包) - 已经包含在内。我不反对使用安全密钥(答案已更新)。答案远离使用PPA
= Personal Package Archives,因为它们必然依赖于一个人,因此可能会出错。正如 Michael Rutter 本人所说(2012 年):“如果您一直在使用 CRAN,那么没有理由更改为 PPA,因为在两个位置都提供了相同的软件包。”【参考方案12】:
在linux中,现在很简单。只需制作:
install.packages("ropenblas")
ropenblas::rcompiler()
【讨论】:
以上是关于安装新版本 R 的无痛方式?的主要内容,如果未能解决你的问题,请参考以下文章