Безболезненный способ установить новую версию 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)

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

Изменить: в коде отсутствовала скобка

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

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

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

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

Саймон

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

  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"

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

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

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

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

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

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

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

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

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

Затем в R вы можете вставить ту переменную, которая генерируется (добавить |pbcopy до конца, чтобы скопировать его напрямую. Как только это будет определено в новой версии R, вы можете просмотреть установленные пакеты из приведенных выше инструкций...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)

Для меня эта страница хороша 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 просто позвони

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

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

      install.packages("ropenblas")
ropenblas::rcompiler()
Другие вопросы по тегам