2011-11-03 23 views
21

Zanim przejdę do wersji R-2.14, chcę wykorzystać okazję do zracjonalizowania struktury folderów zainstalowanych pakietów.Jak zarządzać wieloma lokalizacjami pakietów (folderami) w R?

W tej chwili używam domyślnego R, tj. Wszystkie nowe zainstalowane pakiety trafiają do R_LIBS_USER. Jednak naprawdę rozróżniam dwie klasy pakietów:

  • Pakiety, których wielokrotnie używam do wykonania mojej pracy, np. plyr, data.table itp
  • pakiecie zainstalować tylko eksperymentować z (często powtórzyć pytanie lub odpowiedzieć na StackOverflow)

Od install.packages oferuje jedną z opcji, aby określić lib argumentu, to wyraźnie to możliwe.

Czy istnieje łatwy sposób na zarządzanie lokalizacjami pakietów, np. tworząc pewne sensowne ustawienia/wrappery w .RProfile lub RProfile.Site?

+1

Oto [powiązane i użyteczne pytania i odpowiedzi] (http://stackoverflow.com/questions/2988559/how-do-you-use-multipleversions-the-same-r-package). – Iterator

Odpowiedz

24

Istnieje wiele opcji. Pierwszą rzeczą, którą zrobiłem, było zaadaptowanie mojego pliku Rprofile.site w celu zawarcia poniższego wiersza, dzięki czemu domyślna ścieżka do biblioteki jest katalogiem niewymienionym w mojej instalacji R.

.libPaths(c("D:/R/Library",.libPaths())) 

To sprawia, że ​​D:/R/Library jest moją domyślną ścieżką bez utraty innych ścieżek. Możesz dodać dwie ścieżki do tej, na przykład D:/R/Library/Work i D:/R/Library/Test. Ten, który jest umieszczony na pierwszym miejscu, jest domyślny, jeśli nie określisz lib w install.packages().

Następnie można przypisać dwie zmienne do pliku .Rprofile.site. Te są przypisane w podstawowej przestrzeni nazw i dlatego zawsze są dostępne i nie są usuwane przez ls(). Coś jak

.libwork <- 'D:/R/Library/Work' 
.libtest <- 'D:/R/Library/Test' 

który pozwala na zainstalowanie pakietów jak:

install.packages('aPackage',lib=.libwork) 

Istnieją też inne opcje, jak sądzę, ale to jak będę toczyć.

+0

+1 Wspaniałe wskazówki, Joris. –

+3

Notatka ostrzeżenia podczas korzystania z tego podejścia: prowadzi to do komplikacji podczas próby sprawdzenia/kompilacji/instalacji pakietów za pomocą 'R CMD check ...'. Powodem jest, że 'R CMD check' i' R CMD build' nie czyta '.Rprofile' (http://cran.r-project.org/doc/manuals/R-exts.html#Checking-and- pakiety budowlane). – Andrie

4

Powinieneś być w stanie określić kilka ścieżek/drzew bibliotek za pomocą rozdzielonej dwukropkami listy ścieżek w zmiennej środowiskowej R_LIBS. Nie mogłem tego zrobić niezawodnie na R 2.13.1-poprawka - to zawsze ma pierwszy wpis. Mam R_LIBS i R_LIBS_USER, aby działały niezawodnie na moim komputerze - zwykle ustawiam tylko ten pierwszy.

.libPaths() może dodawać nowe ścieżki do zestawu przeszukiwanych drzewek bibliotecznych. Właśnie dodałem odpowiednie wywołania do .libPaths(new) w moim .Rprofile, aby dodać odpowiednie drzewa dla każdej sesji. Następnie możesz wybrać miejsce instalacji pakietów w czasie instalacji - tzn. Którego drzewa użyć.

+0

To samo doświadczenie tutaj. Dlatego używam .libPaths(), aby ustawić te. Również dlatego, że install.packages() przyjmuje jako pierwszą wartość domyślną wartość .libPaths(). Po prostu okazało się to łatwiejsze niż manipulowanie zmiennymi środowiskowymi. –

2

Aby odpowiedzieć, muszę podać trochę kontekstu.

Dla celów odtwarzalności, próbuję pisać scenariusze, w tym całą konfigurację R. Mam skrypt "initializeR.r", który między innymi instaluje pakiety, a ja przygotowałem pakiety w pakietach, takich jak te związane z cacheingiem, te związane z wizualizacją, próbkowaniem, statystykami przestrzennymi itp. - moje własne małe widoki zadań, jeśli chcesz.

Na przykład, oto fragment:

# Profiling & testing 
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit") 

łączę kilka wiązek do „poważnej” pakietów (lub podstawowej) listy i inni idą na „wtórnym” listy. Na pewno zainstaluję wszystko na głównej liście - są one potrzebne, aby mieć rozsądne środowisko R, używać własnych skryptów, funkcji i pakietów itp. (Btw, niektóre pakiety są przypisane do wielu pakietów, ale tylko kilka; Usuwam duplikat przed przetworzeniem zbiorczej listy.)

Następnie określę domyślną bibliotekę domyślną dla platformy i zainstaluję ją tam. Ta możliwość jest jednak rozszerzalna i ten pomysł można rozszerzyć o opcjonalne lokalizacje dla każdego pakietu pakietów (lub pakietu): wystarczy mapować z nazwy pakietu, np. "CodingTools" do unikalnego katalogu (ścieżka biblioteki), powiedz "D:/R/Library/CodingTools". Można to zrobić w skrypcie inicjalizacyjnym, z opcjami domyślnymi dla pasujących list, lub lokalizacje mogą być przechowywane gdzie indziej, takie jak tablica asocjacyjna, JSON lub baza danych.

Jak powiedzieli inni, domyślne ścieżki biblioteki muszą zostać przekazane R. Można to zrobić na stronie .RProfile.site. W moim przypadku mam inny skrypt, który jest używany do zainicjowania instancji R, tak jakbym chciał. Próbuję unikać zewnętrznych plików parametrów, które są odczytywane przez R (na przykład .Rprofile), a zamiast tego wszystkie inicjalizacje są wywoływane przez funkcje w moim własnym pakiecie (chociaż parametry są nadal zewnętrzne). To ułatwia mi debugowanie i odtwarzanie mojej pracy. Tak więc ścieżki mojej biblioteki mogą być zawarte w tym samym rodzaju JSON, w którym określone są moje lokalizacje plików danych.

Osobiście chcę odejść od definiowania pakietów wewnątrz skryptu i zamiast tego używać JSON, ponieważ mogę łatwiej tworzyć różne pliki JSON dla różnych konfiguracji konfiguracji. Już to robię dla większości innych celów powtarzalnej pracy.

Powiązane problemy