我安装了多个版本的 R(2.15 和 3.0.1),我经常在它们之间切换。我想确保当我在一个版本中安装一个包时,它也会出现在另一个版本中(如果可能的话),所以我尝试设置以下系统:
- 当安装了一个包(在任一版本中)时,写出一个 csv 文件,~/.Rinstalled,其中包含所有已安装包的列表
- 打开新的 R 会话时,检查该文件是否存在。
- 如果该文件存在,则将该列表与当前运行的 R 版本中安装的包进行比较。
- 尝试安装所有丢失的软件包。
为此,我的 .Rprofile 中有以下代码:
mirrorSetup <- function() {
cat("Recursive Statement?\n")
require(utils)
if(file.exists("~/.Rinstalled")) {
packages <- as.vector(read.csv("~/.Rinstalled")[,2])
notInstalled <- packages[!(packages %in% rownames(installed.packages()))]
# Remove file on exit if we're in a different version of R.
if (length(notInstalled) > 0) {
on.exit({
unlink("~/.Rinstalled")
})
}
for (i in seq_along(notInstalled)) {
# Check if package installed via previous dependency in for loop
updated <- rownames(installed.packages())
if (notInstalled[i] %in% updated) {
next
}
# Try to install via Cran first, then Bioconductor if that fails
tryCatch({
utils::install.packages(notInstalled[i])
}, error = function(e) {
try({
source("http://bioconductor.org/biocLite.R")
biocLite(notInstalled[i])
}, silent = TRUE)
})
}
}
}
mirrorSetup()
但是,当这段代码运行时,它会递归调用mirrorSetup()
,utils::install.packages(notInstalled[i])
我不知道为什么。
这是一些示例输出,显示它反复尝试安装它找到的第一个包(ade4)
Recursive Statement?
Loading required package: utils
Trying to install ade4 from Cran...
trying URL 'http://cran.ms.unimelb.edu.au/src/contrib/ade4_1.5-2.tar.gz'
Content type 'application/x-tar' length 1375680 bytes (1.3 Mb)
opened URL
==================================================
downloaded 1.3 Mb
Recursive Statement?
Loading required package: utils
Trying to install ade4 from Cran...
trying URL 'http://cran.ms.unimelb.edu.au/src/contrib/ade4_1.5-2.tar.gz'
Content type 'application/x-tar' length 1375680 bytes (1.3 Mb)
opened URL
==================================================
downloaded 1.3 Mb
有任何想法吗?