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

158

Эндрю Гельман недавно выразил сожаление по поводу отсутствия простого процесса обновления 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)
Шейн
источник
1
Насколько актуально решение, которое использовалось здесь?
майор
Я использовал его недавно и прекрасно работает.
Litwos

Ответы:

74

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

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

Йорис Мейс
источник
2
@Prasad: Thx. Ответ немного устарел, хотя R 2.12 и далее автоматически сохраняет пакеты, которые вы устанавливаете самостоятельно, где-то в стандартной библиотеке за пределами основного дерева R. Поэтому все, что вам нужно сделать сейчас, это убедиться, что вы нашли эту библиотеку и ссылку на нее, если это не произошло само по себе.
Йорис Мейс
@ 428790: Где я могу найти ту библиотеку, о которой ты упоминаешь?
Даниэль Кризиан
@DanielKrizian Посмотрите на значение по умолчанию во внутреннем объекте .Library. В моем случае, это указывает на папку установки R, если она не изменилась (что мне особенно не нравится, но хорошо)
Joris Meys
42

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

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

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

Больше информации о {installr} здесь .

Саймон

SJDS
источник
2
Как насчет пакетов, установленных через github?
Скан
8
Следует отметить, что это для Windows.
Beroe
27

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

  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"
Дирк Эддельбюттель
источник
Интересно, возникают ли проблемы с переносом пакетов, скажем, с R 2.8 на R.9? Или все будет хорошо, пока вы делаете update.packages в новой версии?
Эдуардо Леони
Я занимаюсь этим уже довольно давно, и у меня не было проблем. R обычно является «совместимым в прямом направлении». И для IIRC только одно обновление (возможно, R 1.9 -> R 2.0) потребовало перестройки всех библиотек.
Дирк Эддельбюттель
5
Я также обычно просто копирую свою папку Library в мою новую установку и запускаю update.packages. Вроде нормально работает. Необязательная папка установки, однако, намного элегантнее.
kpierce8
Просто чтобы указать - я добавил ответ с кодом R, выполняющим предложение Дирка (для пользователей R Windows)
Таль Галили
26

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

Что касается решения, приведенного в вопросе, может быть нелегко запустить старую версию 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цикла.
Рафаэле Вакка
источник
Это решило мою проблему, спасибо! Этот вопрос может показаться немного глупым, но я могу удалить старые библиотеки?
m_c
4

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

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

Таль Галили
источник
2
Для самых последних версий R у Tal есть пакет, installrкоторый автоматизирует этот процесс (в настоящее время только в Windows). R-statistics.com/tag/installr или github.com/talgalili/installr
Луи Мэддокс,
1
Запуск Rgui.exe из C: \ Program Files \ R \ R-3.6.0 \ Bin \ i386 и писать код на консоль: install.packages(installr); library(installr); updateR(TRUE). В конце [1] TRUEпоявляется. Благодаря превосходному пакету Галили я очень легко перешел с R 3.6.0 на R 3.6.1. Спасибо Тал.
Эрдоган СЕВЕР
2

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

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

У меня 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

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

для меня эта страница хороша https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ или другой вариант - просто установить новый вариант и в конце концов вы положили, например, в окнах в моем компьютере

.libPaths (c ("D: /Documents/R/win-library/3.2", "C: / Program Files / R / R-3.2.3 / library", "C: / Program Files / R / R-3.2 .0 / библиотека "," D: /Documents/R/win-library/2.15 ")

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

juanprimate
источник
0

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) и не является исчерпывающим , но обеспечить NO. из «дополнений», которые важны для разумного нет. из 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) один за другим в цикле из оболочки несколько неэффективна, но допускает более простое отслеживание ошибок, IMHO. Может занять некоторое время в зависимости от нет. из Rпакетов, так что, возможно , самый простой , чтобы позволить работать на ночь ...

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