Цикл for в.Rprofile вызывает себя рекурсивно?
У меня установлено несколько версий 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
Есть идеи?
1 ответ
Так что у меня была тренировка, и я не смогу сделать то, что пытаюсь. Функция install.packages
перезагружает ваш.Rprofile, когда он вызывается. Например, если я сделаю следующее:
Создать временный.Rprofile:
cat(".Rprofile loaded!\n")
Загрузить R:
R version 3.0.0 (2013-04-03) -- "Masked Marvel"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin12.3.0 (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
.Rprofile loaded
> install.packages("ade4")
--- Please select a CRAN mirror for use in this session ---
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
.Rprofile loaded
Показывает, что.Rprofile снова читается при установке пакета.
Хотя процесс зеркального отображения пакетов не может быть автоматизирован подобным образом, функцию все равно можно оставить в.Rprofile и вызвать пользователем вручную.