Wydaje mi się, że w dzisiejszych czasach udostępniam dużo kodu współautorom. Wielu z nich to początkujący / średniozaawansowani użytkownicy R i nie zdają sobie sprawy, że muszą instalować pakiety, których jeszcze nie mają.
Czy istnieje elegancki sposób na połączenie installed.packages()
, porównaj to z tymi, które ładuję i zainstaluj, jeśli go brakuje?
R version 3.0.2 (2013-09-25) x86_64-w64-mingw32/x64 (64-bit)
.base
... ;-)Odpowiedzi:
Tak. Jeśli masz listę pakietów, porównaj ją z danymi wyjściowymi
installed.packages()[,"Package"]
i zainstaluj brakujące pakiety. Coś takiego:Inaczej:
Jeśli umieścisz swój kod w pakiecie i uzależnisz je, zostaną one automatycznie zainstalowane podczas instalacji pakietu.
źródło
if(length(new.packages)>0) {install.packages(new.packages)}
new.packages <- c(1,2)
length(new.packages)
if(length(new.packages)){print("hello!")}else{print("oh no!")}
require
zamiast sprawdzaniainstalled.packages
packrat
został stworzony do tego. Jest to powtarzalny system zarządzania pakietami. W ten sposób idzie to w niewłaściwy sposób i miesza się z czyimś środowiskiem, a nie jest odtwarzalne. Packrat ma własny folder i środowisko dla bibliotek współdzielonych. rstudio.github.io/packratDason K. i mam pacman pakiet, który może to zrobić ładnie. Funkcja
p_load
w pakiecie to robi. Pierwszy wiersz ma na celu upewnienie się, że Pacman jest zainstalowany.źródło
/
i automatycznie zainstalował / załadował z github.if (!require("pacman")) install.packages("pacman")
nazywa sięp_boot()
tą linią dla Ciebie automatycznie i kopiuje ją do schowka.Możesz po prostu użyć zwracanej wartości
require
:Używam
library
po instalacji, ponieważ spowoduje to wyjątek, jeśli instalacja nie powiedzie się lub pakiet nie może zostać załadowany z innego powodu. Sprawiasz, że jest to bardziej niezawodne i wielokrotnego użytku:Minusem tej metody jest to, że musisz przekazać nazwę pakietu w cudzysłowie, czego nie robisz tak naprawdę
require
.źródło
character.only = TRUE
wrequire
, ale to chyba nie ma nic do odróżnienia odpowiedź od kopalni.„ggplot2” to pakiet. Sprawdza, czy pakiet jest zainstalowany, jeśli nie jest, to go instaluje. Następnie ładuje pakiet bez względu na wybraną gałąź.
źródło
To rozwiązanie pobierze wektor znakowy nazw pakietów i spróbuje je załadować lub zainstalować, jeśli ładowanie się nie powiedzie. Polega na zachowaniu powrotu w
require
celu wykonania tej czynności, ponieważ ...Dlatego możemy po prostu zobaczyć, czy udało nam się załadować wymagany pakiet, a jeśli nie, zainstaluj go z zależnościami. Biorąc pod uwagę wektor znaków pakietów, które chcesz załadować ...
źródło
require
ponownie zadzwonić po instalacji?if
aby ocenić instrukcję, należy ją najpierw ocenićrequire
, której efektem ubocznym jest ładowanie pakietu, jeśli jest dostępny!install.packages
, ponieważ tak naprawdę nie załadowałoby tego pakietu. Ale (do @krlmlr) podejrzewam, że intencją jest, aby ten fragment kodu był wywoływany tylko raz; nie pisałbyś tego za każdym razem, gdy potrzebowałeś pakietu. Zamiast tego uruchomisz go raz przed czasem, a następnie zadzwoniszrequire
tak, jak to konieczne.require
wezwanie dolibrary
tak głośno, że nie powiedzie się, jeśli jest jeszcze w stanie dołączyć pakiet z jakiegoś powodu?Wiele powyższych odpowiedzi (i duplikatów tego pytania) opiera się na
installed.packages
złej formie. Z dokumentacji:Lepszym rozwiązaniem jest próba załadowania pakietu przy użyciu
require
i instalacji, jeśli ładowanie się nie powiedzie (require
zwróci,FALSE
jeśli nie zostanie znalezione). Wolę tę implementację:które mogą być użyte w ten sposób:
W ten sposób ładuje wszystkie pakiety, a następnie wraca i instaluje wszystkie brakujące pakiety (co jeśli chcesz, to przydatne miejsce, aby wstawić monit z pytaniem, czy użytkownik chce zainstalować pakiety). Zamiast wywoływać
install.packages
osobno dla każdego pakietu, przekazuje cały wektor odinstalowanych pakietów tylko raz.Oto ta sama funkcja, ale z oknem dialogowym z pytaniem, czy użytkownik chce zainstalować brakujące pakiety
źródło
Chociaż odpowiedź Shane'a jest naprawdę dobra, dla jednego z moich projektów musiałem usunąć komunikaty wyjściowe, ostrzeżenia i zautomatyzować instalację pakietów . W końcu udało mi się zdobyć ten skrypt:
Posługiwać się:
źródło
źródło
Taki jest cel pakietu rbundler : zapewnienie sposobu kontrolowania pakietów zainstalowanych dla konkretnego projektu. W tej chwili pakiet współpracuje z funkcją devtools w celu instalowania pakietów w katalogu twojego projektu. Funkcjonalność jest podobna do programu pakującego Ruby .
Jeśli twój projekt to pakiet (zalecane), wszystko, co musisz zrobić, to załadować pakiet rbundler i spakować pakiety.
bundle
Funkcja będzie wyglądać na swój pakiet wDESCRIPTION
pliku, aby określić, które pakiety do wiązki.Teraz pakiety zostaną zainstalowane w katalogu .Rbundle.
Jeśli twój projekt nie jest pakietem, możesz go sfałszować, tworząc
DESCRIPTION
plik w katalogu głównym projektu za pomocą pola Depends, które zawiera listę pakietów, które chcesz zainstalować (z opcjonalnymi informacjami o wersji):Oto repozytorium github dla projektu, jeśli jesteś zainteresowany udziałem: rbundler .
źródło
Pewnie.
Musisz porównać „zainstalowane pakiety” z „pożądanymi pakietami”. Jest to bardzo zbliżone do tego, co robię z CRANberries, ponieważ muszę porównać „przechowywane znane pakiety” z „obecnie znanymi pakietami”, aby określić nowe i / lub zaktualizowane pakiety.
Więc zrób coś takiego
aby uzyskać wszystkie znane pakiety, należy wywołać symetrycznie aktualnie zainstalowane pakiety i porównać je z danym zestawem pakietów docelowych.
źródło
Użyj,
packrat
aby udostępnione biblioteki były dokładnie takie same i nie zmieniały środowiska innych osób.Jeśli chodzi o elegancję i najlepsze praktyki, myślę, że zasadniczo postępujesz w niewłaściwy sposób. Pakiet
packrat
został zaprojektowany z myślą o tych problemach. Jest rozwijany przez RStudio przez Hadley Wickham. Zamiast instalować zależności i być może zepsuć czyjś system środowiskowy,packrat
używa własnego katalogu i instaluje wszystkie zależności dla twoich programów tam i nie dotyka czyjegoś środowiska.https://rstudio.github.io/packrat/
źródło
Następująca prosta funkcja działa jak urok:
(nie moje, znalazłem to w sieci jakiś czas temu i używałem go od tego czasu. nie jestem pewien, czy oryginalne źródło)
źródło
Korzystam z następującej funkcji, aby zainstalować pakiet, jeśli
require("<package>")
wychodzi z błędem pakiet nie znaleziono. Przeszukuje zarówno repozytoria CRAN, jak i repozytoria Bioconductor pod kątem brakującego pakietu.Na podstawie oryginalnej pracy Joshua Wileya, http://r.789695.n4.nabble.com/Install-package-automatically-if-not-there-td2267532.html
Przykład:
PS:
update.packages(ask = FALSE)
ibiocLite(character(), ask=FALSE)
zaktualizuje wszystkie zainstalowane pakiety w systemie. Może to zająć dużo czasu i uznać to za pełne ulepszenie R, co może nie być gwarantowane przez cały czas!źródło
loadpack()
na raw.githubusercontent.com/holgerbrandl/datautils/master/R/...Możesz po prostu użyć tej
setdiff
funkcji, aby uzyskać pakiety, które nie są zainstalowane, a następnie je zainstalować. W poniższym przykładzie sprawdzamy, czy pakietyggplot2
iRcpp
są zainstalowane przed ich zainstalowaniem.W jednym wierszu powyższe można zapisać jako:
źródło
installed.packages()[,'Package']
zamiastrownames(installed.packages())
.Zaimplementowałem funkcję cichego instalowania i ładowania wymaganych pakietów R. Nadzieja może pomóc. Oto kod:
źródło
Nadchodząca wersja RStudio (1.2), już dostępna w wersji zapoznawczej, będzie zawierać funkcję wykrywania brakujących pakietów
library()
irequire()
wywołań oraz monitowania użytkownika o ich zainstalowanie:Wydaje się, że szczególnie dobrze odnosi się to do pierwotnego problemu PO:
źródło
Jeśli chodzi o twój główny cel „zainstalować biblioteki, których jeszcze nie mają.” I bez względu na użycie „instllaed.packages ()”. Poniższa funkcja maskuje pierwotną funkcję wymaganą. Próbuje załadować i sprawdzić nazwany pakiet „x”, jeśli nie jest zainstalowany, zainstaluj go bezpośrednio z uwzględnieniem zależności; i na koniec załaduj go normalnie. zmieniasz nazwę funkcji z „wymagaj” na „biblioteka”, aby zachować integralność. Jedynym ograniczeniem jest cytowanie nazw pakietów.
Możesz więc załadować i zainstalować pakiet staromodny sposób R. wymaga („ggplot2”) wymaga („Rcpp”)
źródło
delete
link nad tymi komentarzami. Jeśli nie, a nadal chcesz usunąć, użyjflag
linku, wybierz „inne” i wyjaśnij moderatorowi, że chcesz usunąć odpowiedź.Całkiem podstawowy.
źródło
Pomyślałem, że wrócę do tego, którego używam:
źródło
źródło
Używając rodzinnej rodziny i anonimowego podejścia do funkcji, możesz:
||
leniwej oceny).Wydrukuj stan końcowego obciążenia każdej paczki (
TRUE
/FALSE
).źródło
Używam następujących, które sprawdzą, czy pakiet jest zainstalowany i czy zależności są aktualizowane, a następnie ładuje pakiet.
źródło
Oto mój kod:
źródło
źródło
Działa to z niecytowanymi nazwami pakietów i jest dość elegancki (por. Odpowiedź GeoObserver)
źródło
W moim przypadku chciałem jednej linijki, którą mogłem uruchomić z wiersza poleceń (właściwie przez Makefile). Oto przykład instalacji „VGAM” i „wtapiania”, jeśli nie są jeszcze zainstalowane:
Z poziomu R byłoby to po prostu:
Nie ma tu nic poza poprzednimi rozwiązaniami oprócz tego, że:
repos
parametru (aby uniknąć wyskakujących okienek z pytaniem o użycie kopii lustrzanej)Zwróć też uwagę na ważne
character.only=TRUE
(bez niego,require
próbowałby załadować pakietp
).źródło
źródło
Pozwólcie, że podzielę się odrobiną szaleństwa:
źródło