Bezbolesny sposób na zainstalowanie nowej wersji R?

158

Andrew Gelman ostatnio ubolewał nad brakiem łatwego procesu aktualizacji dla R (prawdopodobnie bardziej istotne w systemie Windows niż Linux). Czy ktoś ma dobrą sztuczkę do wykonania aktualizacji, od instalacji oprogramowania po skopiowanie wszystkich ustawień / pakietów?

Ta sugestia została zawarta w komentarzach i właśnie z niej ostatnio korzystam. Najpierw zainstaluj nową wersję, a następnie uruchom to w starej wersji:

#--run in the old version of R
setwd("C:/Temp/")
packages <- installed.packages()[,"Package"]
save(packages, file="Rpackages")

Następnie w nowej wersji:

#--run in the new version
setwd("C:/Temp/")
load("Rpackages")
for (p in setdiff(packages, installed.packages()[,"Package"]))
install.packages(p)
Shane
źródło
1
Na ile aktualne jest zastosowane tutaj rozwiązanie?
maj
Użyłem go niedawno i działa świetnie.
Litwos

Odpowiedzi:

74

Dla pełnego obrazu istnieje kilka sposobów, aby zapobiec wystąpieniu tego problemu. Jak powiedział Dirk, zapisz swoje pakiety w innym katalogu na swoim komputerze.

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

Można zmienić domyślne .Librarywartości używając funkcji .libPathszbyt

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

Spowoduje to umieszczenie tej ścieżki jako pierwszej wartości w .Libraryzmiennej i uczyni ją domyślną.

Jeśli chcesz zautomatyzować to dalej, możesz to określić w pliku Rprofile.site, który znajdziesz w katalogu / etc / twojej kompilacji R. Następnie ładuje się automatycznie za każdym razem, gdy ładuje się R i nie musisz się już o to martwić. Możesz po prostu zainstalować i załadować pakiety z określonego katalogu.

Na koniec mam mały kod zawarty w moim Rprofile.site, który pozwala mi ponownie zainstalować wszystkie pakiety, kiedy instaluję nową wersję R. Wystarczy je wymienić, zanim zaktualizujesz do nowej wersji R. Robię to używając pliku .RData zawierającego zaktualizowaną listę wszystkich pakietów.

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])
}

Tworzę packagelist.RData, podając .Last()w moim Rprofile.site. To aktualizuje listę pakietów, jeśli zainstalowałem kilka:

.Last <- function(){
  pkgs <- installed.packages()[,1]
  if (length(pkgs) > length(installed)){
    save(pkgs,file="G:\Setinfo\R\packagelist.RData")
  }
}

Kiedy instaluję nową wersję R, po prostu dodaję niezbędne elementy do pliku Rprofile.site i ponownie instaluję wszystkie pakiety. I tak muszę dostosować Rprofile.site (używając kontrastów sum, dodając dodatkowy kod dla Tinn-R, te rzeczy), więc tak naprawdę nie jest to dodatkowa praca. Instalacja wszystkich pakietów od nowa zajmuje po prostu więcej czasu.

Ten ostatni fragment jest równoważny temu, co podano w pierwotnym pytaniu jako rozwiązanie. Po prostu nie muszę się martwić o to, że najpierw otrzymam listę „zainstalowanych”.

Ponownie, nie działa to bezbłędnie, jeśli masz pakiety, które nie są instalowane z CRAN. Ale ten kod można łatwo rozszerzyć, aby uwzględnić również te.

Joris Meys
źródło
2
@Prasad: Thx. Odpowiedź jest jednak nieco przestarzała, R 2.12 i dodatkowo automatycznie zapisuj pakiety, które instalujesz samodzielnie, gdzieś w standardowej bibliotece poza głównym drzewem R. Więc wszystko, co musisz teraz zrobić, to upewnić się, że znalazłeś tę bibliotekę i łącze do niej, jeśli to się nie stało.
Joris Meys
@ 428790: Gdzie mogę znaleźć tę bibliotekę, o której wspomniałeś?
Daniel Krizian,
@DanielKrizian Spójrz na domyślny obiekt wewnętrzny .Library. W moim przypadku wskazuje z powrotem na folder instalacyjny R, jeśli nie został zmieniony (czego szczególnie nie lubię, ale dobrze)
Joris Meys
42

Jest to oczywiście stare pytanie, ale może istnieć nowa, łatwa odpowiedź (działająca tylko dla systemu Windows), którą właśnie znalazłem.

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

Najlepszym sposobem na to jest skorzystanie z systemu RGui. Wszystkie twoje pakiety zostaną przeniesione do nowego folderu, a stare zostaną usunięte lub zapisane (możesz wybrać jeden z nich). Po ponownym otwarciu RStudio natychmiast rozpoznaje, że używasz zaktualizowanej wersji. Dla mnie to zadziałało jak urok,

Więcej informacji o {installr} tutaj .

Szymon

SJDS
źródło
2
A co z pakietami zainstalowanymi przez github?
skan
8
Należy wspomnieć, że dotyczy to systemu Windows.
beroe
27

Dwie szybkie sugestie:

  1. Użyj plików wsadowych Gabora, o których mówi się, że zawierają narzędzia pomagające np. W przenoszeniu bibliotek zbiorczych. Uwaga: nie korzystałem z nich.

  2. Nie instaluj bibliotek w „drzewie plików” zainstalowanej wersji R. W systemie Windows mogę umieścić R w wersji C: / opt / R / R- $, ale umieszczam wszystkie biblioteki w C: / opt / R / library / za pomocą następującego fragmentu kodu, ponieważ łagodzi to problem w pierwszej kolejności:

$ cat .Renviron         # this is using MSys/MinGW which looks like Cygwin  
## Example .Renviron on Windows    
R_LIBS="C:/opt/R/library"
Dirk Eddelbuettel
źródło
Zastanawiam się, czy przeniesienie paczek z, powiedzmy, R 2.8 do R.9 powoduje jakieś problemy? A może wszystko będzie dobrze, o ile będziesz robić update.packages w nowej wersji?
Eduardo Leoni,
Robię to od dłuższego czasu i nie miałem żadnych problemów. R jest zazwyczaj „kompatybilny w przód”. A IIRC tylko jedno uaktualnienie (mogło to być R 1.9 -> R 2.0) wymagało przebudowy wszystkich bibliotek.
Dirk Eddelbuettel
5
Zwykle po prostu kopiuję folder Biblioteki do nowej instalacji i uruchamiam update.packages. Wydaje się, że działa dobrze. Opcjonalny folder instalacyjny jest jednak znacznie bardziej elegancki.
kpierce8
Dla przypomnienia - dodałem odpowiedź z kodem R wykonującym sugestię Dirka (dla użytkowników R Windows)
Tal Galili
26

Sugerowana powyżej metoda nie zadziała całkowicie, jeśli masz pakiety, które nie pochodzą z CRAN. Na przykład pakiet osobisty lub pakiet pobrany z witryny innej niż CRAN.

Moja preferowana metoda w systemie Windows (aktualizacja 2.10.1 do 2.11.0):

  1. Zainstaluj R-2.11.0
  2. Skopiuj R-2.10.0/library/*doR-2.11.0/library/
  3. Odpowiedz „nie” na monity z pytaniem, czy można nadpisać.
  4. Uruchom R 2.11.0
  5. Uruchom polecenie R. update.packages()
Kevin Wright
źródło
7

W odniesieniu do rozwiązania podanego w pytaniu, uruchomienie starszej wersji R może nie być łatwe, jeśli masz już zainstalowaną nową wersję. W takim przypadku nadal możesz ponownie zainstalować wszystkie brakujące pakiety z poprzedniej wersji R. w następujący sposób.

# 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) 
      }
    }

(Zwróć uwagę, że argument do list.files()w pierwszym wierszu kodu powinien być ścieżką do katalogu biblioteki dla poprzedniej wersji R, w którym znajdują się wszystkie foldery pakietów z poprzedniej wersji. W moim obecnym przypadku tak jest "/Library/Frameworks/R.framework/Versions/3.2/Resources/library". Będzie inaczej, jeśli Twoja poprzednia wersja R jest inna niż 3.2 lub jeśli używasz systemu Windows.)

ifOświadczenie zapewnia, że pakiet jest nie zainstalowany, jeśli

  • Jest już zainstalowany w nowej wersji R lub
  • Został zainstalowany jako zależność od pakietu zainstalowanego w poprzedniej iteracji forpętli.
Raffaele Vacca
źródło
To rozwiązało mój problem, dzięki! To pytanie może zabrzmieć trochę głupio, ale czy mogę usunąć stare biblioteki?
m_c
4

Zgodnie z sugestią Dirka, oto kod R, aby zrobić to w systemie Windows: Jak łatwo zaktualizować R w systemie Windows XP

Aktualizacja (15.04.11): Napisałem kolejny post na ten temat, wyjaśniając, jak radzić sobie z typowymi problemami z aktualizacją R w systemie Windows 7

Tal Galili
źródło
2
W przypadku najnowszych wersji R Tal ma pakiet o nazwie, installrktóry automatyzuje ten proces (obecnie tylko w systemie Windows) r-statistics.com/tag/installr lub github.com/talgalili/installr
Louis Maddox,
1
Run Rgui.exe z C: bin \ i386 i napisać kod do konsoli \ Program Files \ R \ R-3.6.0 \: install.packages(installr); library(installr); updateR(TRUE). Na końcu [1] TRUEpojawia się. Dzięki doskonałemu pakietowi Galili bardzo łatwo przeszedłem z R 3.6.0 do R 3.6.1. Dzięki Tal.
Erdogan CEVHER
2

Dwie opcje:

  1. Wprowadź tutaj moją odpowiedź
  2. Jeśli używasz R w Eclipse ze StatET, otwórz Run Configurations , kliknij kartę Console iw polu o nazwie R snippet run after startup dodaj ten wiersz z wybranym katalogiem:.libPaths("C:/R/library")
Fred
źródło
1

Korzystam z systemu Windows 8 iz jakiegoś dziwnego powodu nigdy nie mogę instalować pakietów przy użyciu połączeń internetowych.

Generalnie instaluję go przy użyciu pliku .zip z CRAN.

Po przejściu z R 3.2.5 do R 3.3.1.

Po prostu skopiowałem pakiety z

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

A potem ponownie uruchomiłem sesję R. Działał doskonale. Nie sprawdziłem, czy WSZYSTKIE pakiety działają dobrze. Ale te, które sprawdziłem, działają doskonale. Mam nadzieję, że ten hack zadziała dla każdego.

Twoje zdrowie.

Pragyaditya Das
źródło
1

Zaakceptowana odpowiedź może zadziałać, jeśli masz przewidywanie, ale pozbyłem się już starej wersji, więc nie byłem w stanie zastosować się do tych wskazówek. Kroki opisane poniżej działały przy aktualizacji OSX z wersji 2.1 i 3.1.

AKTUALIZACJA: Aby uzyskać katalog dla najnowszej wersji (zamiast wpisywać 3.1 lub 3.2), możesz użyć poniższych poleceń. Drugi konwertuje bezpośrednio na zmienną R, pomijając .i, ..i .DS_Storeużyj:

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 "/" 

(Dodaj |pbcopy na końcu, aby skopiować go bezpośrednio do schowka Maca)

Następnie w R możesz wkleić wygenerowaną zmienną. Po zdefiniowaniu tego w nowej wersji języka R możesz przeglądać zainstalowane pakiety, korzystając z powyższych instrukcji ...

for (p in setdiff(packages, installed.packages()[,"Package"]))
   install.packages(p, dependencies=TRUE, quiet=TRUE, ask=FALSE)
beroe
źródło
0

dla mnie ta strona jest dobra https://www.r-statistics.com/2013/03/updating-r-from-r-on-windows-using-the-installr-package/ lub inna opcja to po prostu zainstaluj nową opcja i na koniec wstawiasz np. w windows na moim komputerze

.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 / library "," D: /Documents/R/win-library/2.15 ")

każda ścieżka ostatniej wersji w moim przypadku zawsze umieszczam pierwszą ścieżkę "D: /Documents/R/win-library/3.2", która jest naprawiona, a następnie umieszczam drugą, ponieważ nie potrzebujesz kopiować ani przenosić żadnych pakietów, w sugeruję, żeby to nazwać

juanprimate
źródło
0

linux + bash + debian+ aptużytkowników:

  1. Jeśli instalujesz / aktualizujesz do najnowszej wersji R, możemy założyć, że masz rootuprawnienia. (Nie jest to konieczne, po prostu znacznie upraszcza proces; dla spójności poniższy skrypt używa sudodla wszystkich instalacji). Ponieważ Rpakiety są również instalowane przez root, dozwolone jest umieszczanie ich w plikach /usr/local/.

  2. Poniższe wezwanie curlzakłada, że ​​jesteś już zainteresowany sidwydaniemR najnowszej niestabilnej wersji (zgodnie z wymaganiami podczas budowania / sprawdzania Rpakietu), tj.

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

    chociaż można to łatwo zastąpić niedawną stabilną wersją, np buster.

  3. Zauważ, że nie używam klucza, jak jest to zwykle zalecane . Nie jest to konieczne, szczególnie jeśli (jak w poniższym skrypcie) instalujemy pakiety w R sobie ( Rscript -eponiżej). Ponadto takie klucze mają tendencję do łamania / zmiany co kilka lat. W związku z tym możesz oczywiście dodać następujący przedmowę do pliku, R.shktóry:

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

  4. arrayZ Rpakietów wyraźnie nie jest wyczerpująca, ale daje kilka przykładów, które ja osobiście uważam użyteczne. Świeża instalacja / aktualizacja z debianpakietem r-recommended, jak poniżej, powinna dać najnowszą wersję wszystkich standardowych „zalecanych” pakietów (np.survival .). Uważam, że może wystąpić niewielkie opóźnienie między wydaniem CRAN a aktualizacją odpowiedniego debianpakietu. Dlatego możesz chcieć dodać niektóre z nich do arrayponiższych, jeśli posiadanie najnowszej wersji „zalecanego” Rpakietu jest niezbędne.

  5. Te debianpakiety zainstalowane w poniższej procesu są również ani istotne (za korzystanier-base ), ani wyczerpujące, ale zapewniają nie. „dodatków”, które są ważne dla rozsądnego „nie”. z Rpakietów.

W każdym razie ... umieść w 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

Następnie uruchom go, np zakładając już w katalogu: source R.sh.

Instalowanie pakietów (czy to czy debianteż R) pojedynczo w pętli z powłoki jest nieco nieefektywne, ale pozwala na prostsze śledzenie błędów, IMHO. Może to zająć trochę czasu, w zależności od numeru. od Rpakietów, więc może najprostsze do wynajęcia prowadzony przez noc ...

dardisco
źródło
1
Nie wiem, dlaczego słowo „survival” znajduje się na tej liście pakietów dodatkowych. (I jest całkiem możliwe, że wprowadzam w błąd ten skrypt basha.) Jest to pakiet „polecany” od ... od zawsze. Jeśli nie instalujesz wszystkich zalecanych pakietów za pomocą tego skryptu, należy go zmodyfikować, aby to zrobić. Pomyśl także, że zestaw pakietów r-base-devel byłby potrzebny każdemu, kto używa Linuksa. A dlaczego nie dodać PPA Michaela Ruttera?
IRTFM
Dziękuję Ci! Zaktualizowano w świetle Twoich pomocnych komentarzy. Zgadzam się, nie ma potrzeby rutynowego instalowania pakietu, który jest już w programie r-recommended. „r-base-devel” jest znany jako r-base-dev( debianpakiet) - został już uwzględniony. Nie mam nic przeciwko używaniu klucza bezpieczeństwa (zaktualizowana odpowiedź). Odpowiedzią nie jest używanie a PPA= osobistych archiwów paczek, ponieważ są one z konieczności zależne od jednej osoby, a zatem potencjalnie omylne. Jak mówi sam Michael Rutter (2012): „Jeśli korzystałeś z CRAN, nie ma powodu, aby przechodzić na PPA, ponieważ te same pakiety są dostarczane w obu lokalizacjach”.
dardisco