Цикл for в .Rprofile вызывает себя рекурсивно?

У меня установлено несколько версий R (2.15 и 3.0.1), между которыми я часто переключаюсь. Я хочу убедиться, что когда я устанавливаю пакет в одной версии, он также будет присутствовать в другой (где это возможно), поэтому я попытался настроить следующую систему:

  1. Когда пакет установлен (в любой версии), запишите файл csv, ~/.Rinstalled, который содержит список всех установленных пакетов.
  2. Когда открывается новый сеанс R, проверьте, существует ли этот файл.
  3. Если файл существует, сравните этот список с пакетами, установленными в текущей запущенной версии R.
  4. Попытайтесь установить все недостающие пакеты.

Для этого у меня есть следующий код в моем .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

Любые идеи?


person Scott Ritchie    schedule 30.07.2013    source источник
comment
Вы получаете только два Recursive Statement? или больше? Если бы только два, я бы попробовал заменить mirrorSetup() на invisible(mirrorSetup()).   -  person flodel    schedule 30.07.2013
comment
Вместо этого, почему бы не указать обе версии R в общей библиотеке, чтобы у вас был только один установленный набор пакетов? См. предложения в паре ответов здесь< /а>.   -  person Thomas    schedule 30.07.2013
comment
@flodel Я получаю бесконечность, она продолжает повторяться, пока я не уничтожу команду с помощью ^ C.   -  person Scott Ritchie    schedule 30.07.2013
comment
@Thomas Томас Я не думал, что установленные библиотеки из одной версии R будут работать в другой?   -  person Scott Ritchie    schedule 30.07.2013
comment
@Manetheran Вероятно, это зависит от пакета, некоторые предупреждают об обновлении. Вы можете поэкспериментировать, заменив весь каталог вашей библиотеки в одной версии на каталог из другой, и посмотреть, что произойдет.   -  person Thomas    schedule 30.07.2013
comment
Похоже, это невозможно будет автоматизировать, поэтому я просто оставлю это как функцию, которую я могу вызывать вручную.   -  person Scott Ritchie    schedule 30.07.2013


Ответы (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 и вызвать вручную пользователем.

person Scott Ritchie    schedule 30.07.2013
comment
Посмотрите, работает ли перенос кода в функцию .First. .First вызывается автоматически при запуске, но в другой момент (после загрузки файла глобальной рабочей области .RData). - person Hong Ooi; 30.07.2013
comment
Вы также можете unlink("~/.Rinstalled"), как только он будет прочитан в первый раз, и это должно решить вашу бесконечную рекурсию. - person flodel; 30.07.2013