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

Ответ 1

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

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

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

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

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

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

Саймон

Ответ 3

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

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

  • Не устанавливайте библиотеки в файле 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"

Ответ 4

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

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

  • Установить R-2.11.0
  • Скопировать R-2.10.0/library/* в R-2.11.0/library/
  • Ответьте "нет" на подсказки, спрашивающие вас, нормально ли перезаписывать.
  • Запустить R 2.11.0
  • Запустите команду R update.packages()

Ответ 5

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

.libPaths(с ( "D:/Documents/R/win-library/3.2", "C:/Program Files/R/R-3.2.3/library", "C:/Program Files/R/R-3.2.0/library", "D:/Documents/R/win-library/2.15" )

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

Ответ 11

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

  1. Если вы устанавливаете/обновляете до последней версии R, мы можем предположить, что у вас есть права root. Обратите внимание, что приведенный ниже вызов curl предполагает, что вы уже заинтересованы в версии 'sid', т.е.

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

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

  2. Поскольку мы используем apt для установки R, это должно быть сделано пользователем root то есть с помощью sudo. Здесь R пакеты также устанавливаются пользователем root, и поэтому их можно размещать в /usr/local/.

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

  4. Пакеты debian установленные в описанном ниже процессе, также не являются ни необходимыми (для использования r-base), ни исчерпывающими, но предоставляют нет. из дополнений, которые важны для разумного нет. из R пакетов.

Поместите следующее в R.sh:

sudo apt update && sudo apt --yes full-upgrade
sudo apt install --yes libappstream4 curl
## ov1 = online version
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
## && = then do
command -v 'R --version' &&
    lv1=$(R --version |
              grep --only-matching '[0-9\.]*[0-9]' |
              ## || = otherwise
              head -1) ||
        lv1=0
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' 'survival' '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, так что, возможно, проще всего запустить в одночасье...