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)
为了完整起见,有一些方法可以防止您遇到此问题。正如Dirk所说,将包保存在计算机上的另一个目录中。
install.packages("thepackage",lib="/path/to/directory/with/libraries")
您也可以使用.Library
函数更改默认的.libPaths
值
.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安装,则无法完美运行。但是这个代码很容易扩展,包括那些代码。
对我来说这个页面很好https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/或其他选项只是安装新选项,并在最后你放,例如在我的电脑的窗口
.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”修复然后我把另一个因为你不需要复制或移动任何包,我的sugest只是称之为
linux
+ bash
+ debian
+ apt
用户:
R
,那么我们可能会假设您拥有root
权限。 (不是必需的,只是简化了过程;为了保持一致性,下面的脚本使用sudo
进行所有安装。)由于R
软件包也由root
安装,因此允许将它们放在/usr/local/
中。curl
的调用假设您已经对sid
释放R
感兴趣,R
是最新的不稳定版本(在构建/检查cat /etc/apt/sources.list | grep 'sid' || exit 1
包时需要),即
buster
虽然这可以很容易地被最近的稳定版本取代,例如typically recommended。R
那样使用密钥。这不是必需的,特别是如果(如下面的脚本中)我们在Rscript -e
本身(R.sh
)中安装软件包。而且,这种键每隔几年就有破坏/变化的趋势。因此,您当然欢迎将以下前言添加到sudo apt-key adv --keyserver keyserver.ubuntu.com \
--recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
文件中:
array
R
包装的debian
显然不是详尽无遗的,但提供了一些我认为有用的例子。使用r-recommended
软件包survival
进行全新安装/升级,如下所示,应该提供所有标准“推荐”软件包的最新版本(例如debian
)。我相信CRAN版本与相关array
软件包的更新之间可能存在轻微的延迟。因此,如果最新版本的'推荐'R
包是必不可少的,您可能希望将其中一些添加到下面的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
。
在shell的循环中逐个安装包(无论是R
还是R
)效率有点低,但允许更简单的错误跟踪,恕我直言。可能需要一些时间,具体取决于没有。 qazxswpoi包,所以也许最简单的让一夜之间运行...
这当然是一个老问题,但我可能会找到一个新的简单答案(仅适用于Windows)。
install.packages("installr")
require(installr)
updateR()
最好的方法是使用RGui系统。您的所有包都将被转移到新文件夹,旧文件夹将被删除或保存(您也可以选择)。然后,再次打开RStudio后,它会立即识别出您使用的是更新版本。对我来说,这就像一个魅力,
西蒙
两个快速建议:
$ 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):
R-2.10.0/library/*
复制到R-2.11.0/library/
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
语句确保如果没有安装包
for
循环的上一次迭代中安装的包中。根据Dirk的建议,这里有一些R代码在windows上执行:How to easily upgrade R on windows XP
更新(15.04.11):我写了另一篇关于这个主题的文章,解释了如何处理upgrading R on windows 7的常见问题
两种选择:
.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),您可以使用以下命令。第二个直接转换为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)