Безболезненный способ установить новую версию R?

Эндрю Гельман недавно посетовал на отсутствие простого процесса обновления для 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)

person Shane    schedule 09.09.2009    source источник
comment
Насколько актуально решение, которое здесь использовалось?   -  person maj    schedule 17.05.2014
comment
Я использовал его недавно и отлично работает.   -  person Litwos    schedule 10.10.2015


Ответы (12)


Для полноты картины есть несколько способов предотвратить возникновение этой проблемы. Как сказал Дирк, сохраняйте ваши пакеты в другом каталоге на вашем компьютере.

install.packages("thepackage",lib="/path/to/directory/with/libraries")

Вы также можете изменить значение по умолчанию .Library, используя функцию .libPaths.

.libPaths("/path/to/directory/with/libraries")

Это поместит этот путь в качестве первого значения в переменную .Library и сделает его значением по умолчанию.

Если вы хотите автоматизировать это дальше, вы можете указать это в файле Rprofile.site, который вы найдете в каталоге / etc / вашей сборки R. Затем он будет загружаться автоматически каждый раз, когда загружается 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])
}

Я создаю packagelist.RData, указав .Last() в моем Rprofile.site. Это обновляет список пакетов, если я установил некоторые из них:

.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. Но этот код легко расширить, включив и те.

person Joris Meys    schedule 20.10.2010
comment
@Prasad: Спасибо. Ответ немного устарел, R 2.12 и далее автоматически сохраняют пакеты, которые вы устанавливаете сами, где-нибудь в стандартной библиотеке за пределами основного дерева R. Итак, все, что вам нужно сделать сейчас, это убедиться, что вы нашли эту библиотеку и установили ссылку на нее, если этого не произошло само по себе. - person Joris Meys; 15.04.2011
comment
@ 428790: Где я могу найти ту библиотеку, которую вы упомянули? - person Daniel Krizian; 14.10.2013
comment
@DanielKrizian Посмотрите на значение по умолчанию во внутреннем объекте .Library. В моем случае он указывает на папку установки R, если она не изменилась (что мне особенно не нравится, но хорошо) - person Joris Meys; 16.10.2013

Если вы используете Windows, вы можете использовать пакет installr:

install.packages("installr")
require(installr)
updateR()

Лучше всего это сделать из системы RGui. Все ваши пакеты будут перенесены в новую папку, а старые будут удалены или сохранены (вы можете выбрать любой из них). Затем, как только вы снова откроете RStudio, он сразу же распознает, что вы используете обновленную версию. Для меня это сработало как шарм.

Подробнее информацию о установщике здесь.

person SJDS    schedule 10.04.2014
comment
А как насчет пакетов, установленных через github? - person skan; 23.04.2016
comment
Следует отметить, что это для Windows. - person beroe; 10.08.2016

Два быстрых предложения:

  1. Используйте пакетные файлы Gabor, которые, как говорят, содержат инструменты, помогающие, например, эта массовая библиотека перемещается. Предостережение: я ими не пользовался.

  2. Не устанавливайте библиотеки в «дереве файлов» установленной версии R. В Windows я могу поместить R в версию C: / opt / R / R- $, но поместить все библиотеки в 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"
person Dirk Eddelbuettel    schedule 09.09.2009
comment
Интересно, вызывает ли проблема перенос пакетов, скажем, с R 2.8 на R.9? Или все будет хорошо, пока делаешь update.packages в новой версии? - person Eduardo Leoni; 10.09.2009
comment
Я занимаюсь этим довольно давно и у меня не было проблем. R обычно напрямую совместим. И только одно обновление IIRC (возможно, R 1.9 - ›R 2.0) потребовало перестройки всех библиотек. - person Dirk Eddelbuettel; 10.09.2009
comment
Я также обычно просто копирую папку библиотеки в новую установку и запускаю update.packages. Вроде нормально работает. Необязательная папка для установки, однако, намного элегантнее. - person kpierce8; 10.09.2009
comment
Просто чтобы указать - я добавил ответ с кодом R, выполняющим предложение Дирка (для пользователей R Windows) - person Tal Galili; 15.04.2011

Предложенный выше метод не будет полностью работать, если у вас есть пакеты, не принадлежащие CRAN. Например, личный пакет или пакет, загруженный с сайта, не относящегося к CRAN.

Мой предпочтительный метод в Windows (обновление с 2.10.1 до 2.11.0):

  1. Установить R-2.11.0
  2. Скопируйте R-2.10.0/library/* в R-2.11.0/library/
  3. Ответьте «нет» на запросы, спрашивающие вас, можно ли перезаписать.
  4. Запустить R 2.11.0
  5. Запустите команду R update.packages()
person Kevin Wright    schedule 22.04.2010

Что касается решения, указанного в вопросе, может быть нелегко запустить вашу старую версию 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 гарантирует, что пакет не установлен, если

  • Он уже установлен в новой версии R или
  • Был установлен как зависимость от пакета, установленного на предыдущей итерации цикла for.
person Raffaele Vacca    schedule 08.06.2016
comment
Это решило мою проблему, спасибо! Этот вопрос может показаться немного глупым, но могу ли я удалить старые библиотеки? - person m_c; 27.04.2017

Следуя предложению Дирка, вот некоторый код R, чтобы сделать это в Windows: Как легко обновить R в Windows XP

Обновление (15.04.11): я написал еще одно сообщение на эту тему, объясняя, как решать общие проблемы обновление R в Windows 7

person Tal Galili    schedule 23.04.2010

Два варианта:

  1. Реализуйте мой ответ здесь
  2. Если вы используете R в Eclipse со StatET, откройте Run Configurations, щелкните вкладку Console и в поле с названием R snippet run after startup добавьте это строка с выбранным вами каталогом: .libPaths("C:/R/library")
person Fred    schedule 15.07.2011

Я использую Windows 8, и по какой-то странной причине я никогда не могу устанавливать пакеты, используя свои интернет-соединения.

Обычно я устанавливаю его с помощью файла .zip от CRAN.

После я перешел с 3.2.5 на 3.3.1.

Я просто скопировал пакеты из

C:\Path\to\packa\R\win-library\3.2 to C:\Path\to\packa\R\win-library\3.3.

А затем я перезапустил сеанс R. Сработало отлично. Я не проверял, ВСЕ ли пакеты работают нормально. Но те, которые я проверил, работают отлично. Надеюсь, этот хакер подойдет всем.

Ваше здоровье.

person Pragyaditya Das    schedule 27.08.2016

Принятый ответ может сработать, если у вас есть предвидение, но я уже избавился от старой версии, поэтому не мог следовать этим указаниям. Описанные ниже шаги работали для обновления OSX с 2.1 и 3.1.

ОБНОВЛЕНО: Чтобы получить каталог для вашей последней версии (вместо ввода 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)
person beroe    schedule 13.08.2013

для меня эта страница хороша 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 / библиотека", "C: / Program Files / R / R-3.2 .0 / library "," D: /Documents/R/win-library/2.15 ")

каждый путь к последней версии в моем случае я всегда помещаю первый путь "D: /Documents/R/win-library/3.2", который исправлен, а затем я помещаю другой, потому что вам не нужно копировать или перемещать какие-либо пакеты в мой советчик, просто назови это

person juanprimate    schedule 08.02.2016

linux + bash + debian + apt пользователей:

  1. Если вы устанавливаете / обновляете до последней версии R, мы можем предположить, что у вас есть разрешения root. (Не важно, просто упрощает процесс; для единообразия в приведенном ниже сценарии используется sudo для всех установок.) Поскольку пакеты R также устанавливаются root, их можно разместить в /usr/local/ .

  2. Приведенный ниже вызов curl предполагает, что вы уже заинтересованы в sid выпуске R, самой последней нестабильной версии (в соответствии с требованиями при сборке / проверке R пакета), т. Е.

    cat /etc/apt/sources.list | grep 'sid' || exit 1

    хотя его можно легко заменить на последнюю стабильную версию, например buster.

  3. Обратите внимание, что я не использую ключ как обычно рекомендуется. Это не обязательно, особенно если (как в следующем сценарии) мы устанавливаем пакеты внутри R (Rscript -e ниже). Кроме того, такие ключи имеют тенденцию ломаться / меняться каждые несколько лет. Таким образом, вы, конечно, можете добавить следующее предисловие к файлу R.sh:

    sudo apt-key adv --keyserver keyserver.ubuntu.com \ --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

  4. array из R пакетов явно не является исчерпывающим, но дает некоторые примеры, которые я лично считаю полезными. Новая установка / обновление с debian пакетом r-recommended, как показано ниже, должно дать последний версия всех стандартных «рекомендуемых» пакетов (например, survival). Я считаю, что между выпуском CRAN и обновлением соответствующего debian пакета может быть небольшая задержка. Таким образом, вы можете добавить некоторые из них в array ниже, если необходима последняя версия «рекомендованного» R пакета.

  5. Пакеты 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) по одному в цикле из оболочки несколько неэффективна, но позволяет упростить отслеживание ошибок, ИМХО. Может занять некоторое время в зависимости от номера. из R пакетов, так что, может быть, проще всего запустить на ночь ...

person dardisco    schedule 07.05.2019
comment
Не уверен, почему «выживание» находится в этом списке дополнительных пакетов. (И вполне возможно, что я ввожу в заблуждение этот сценарий bash.) Это рекомендуемые пакеты с ... вечности. Если вы не устанавливаете все рекомендуемые пакеты с этим сценарием, его следует изменить для этого. Также подумайте, что набор пакетов r-base-devel понадобится любому, кто использует Linux. И почему бы не добавить PPA Майкла Раттера? - person IRTFM; 30.05.2019
comment
Спасибо! Обновлено с учетом ваших полезных комментариев. Согласитесь, нет необходимости регулярно устанавливать пакет, который уже находится в r-recommended. 'r-base-devel' известен как r-base-dev (debian пакет) - уже был включен. Я не прочь использовать ключ для безопасности (ответ обновлен). Ответ заключается в том, чтобы не использовать PPA = Персональные архивы пакетов, поскольку они по необходимости зависят от одного человека и, следовательно, потенциально подвержены ошибкам. Как говорит сам Майкл Руттер (2012 г.): «Если вы использовали CRAN, то нет причин переходить на PPA, поскольку одинаковые пакеты предоставляются в обоих местах. - person dardisco; 31.05.2019

В linux, теперь это очень просто. Просто сделай:

install.packages("ropenblas")
ropenblas::rcompiler()
person Pedro Rafael    schedule 17.12.2020