Безболезненный способ установить новую версию R? - PullRequest
147 голосов
/ 10 сентября 2009

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

Ответы [ 11 ]

68 голосов
/ 20 октября 2010

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

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

35 голосов
/ 10 апреля 2014

Конечно, это старый вопрос, но может быть новый простой ответ (работает только для Windows), который я только что нашел.

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

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

Подробнее о {installr} здесь .

Simon

26 голосов
/ 10 сентября 2009

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

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

  2. Не устанавливайте библиотеки внутри «filetree» установленной версии 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"
24 голосов
/ 22 апреля 2010

Метод, предложенный выше, не будет полностью работать, если у вас есть пакеты, которые не из 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()
7 голосов
/ 08 июня 2016

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

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

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

2 голосов
/ 15 июля 2011

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

  1. Реализуй мой ответ здесь
  2. Если вы используете R в Eclipse со StatET, откройте Запустить конфигурации , щелкните вкладку Консоль и в поле с именем Фрагмент R запустите после запуска добавьте строка с вашим выбором каталога: .libPaths("C:/R/library")
1 голос
/ 27 августа 2016

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

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

После того, как я перешел с 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 сессию. Работал отлично. Я не проверял, ВСЕ ли пакеты работают нормально. Но те, которые я проверил, работают отлично. Надеюсь, этот хак работает для всех.

Приветствие.

1 голос
/ 13 августа 2013

Принятый ответ может сработать, если у вас есть предвидение, но я уже избавился от старой версии, поэтому не смог следовать этим указаниям. Описанные ниже шаги работали для обновления 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)
0 голосов
/ 07 мая 2019

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

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

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

    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 пакетов, так что, возможно, проще всего запустить их в одночасье ...

...