2011-08-01 5 views
12

Mam pakiet, który zawiera całą gamę różnych funkcji (patrz What to do with imperfect-but-useful functions?). Ponieważ funkcje nie są szczególnie powiązane, zależą one od całej gamy innych pakietów. Często w całej paczce jest tylko jedna funkcja, która używa innego pakietu. Jeśli jednak używam Importu, Suggest lub Depends w pliku DESCRIPTION, cała lista pakietów będzie ładowana za każdym razem, gdy mój pakiet zostanie załadowany, mimo że bardzo niewiele z nich jest potrzebnych każdemu użytkownikowi.Załaduj pakiet tylko w razie potrzeby w pakiecie R.

Czy istnieje sposób na załadowanie zależności tylko w przypadku użycia określonej funkcji? W samej funkcji mogłem zadzwonić pod numer library(), ale wygląda to na złą praktykę, ponieważ nie mówi nic o systemie zarządzania pakietami, a zatem użytkownik może go nie zainstalować.

Odpowiedz

15

Możesz użyć podpowiedzi, aw funkcji wymagającej pakietu możesz dodać kod do require() wspomnianej paczki, a jeśli nie jest dostępna, wyślij błąd. Przykładem znam, opakowania wegańskiej, ma w swoim opisie

Depends: permute 
Suggests: MASS, mgcv, lattice, cluster, scatterplot3d, rgl, tcltk 

i na załadowanie pakietu mamy:

R> require(vegan) 
Loading required package: vegan 
Loading required package: permute 
This is vegan 1.90-0 

i sessionInfo() doniesienia, że ​​żaden z proponowanych pakietów jeszcze były załadowane/załączone itp .:

R> sessionInfo() 
R version 2.13.1 Patched (2011-07-29 r56550) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_GB.utf8  LC_NUMERIC=C    
[3] LC_TIME=en_GB.utf8  LC_COLLATE=en_GB.utf8  
[5] LC_MONETARY=C    LC_MESSAGES=en_GB.utf8 
[7] LC_PAPER=en_GB.utf8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C   
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] vegan_1.90-0 permute_0.5-0 

loaded via a namespace (and not attached): 
[1] tools_2.13.1 
+0

Dokładnie tego szukałem. Dzięki. –

+4

+1 ta strategia jest prawdopodobnie odpowiednia dla pakietu misc: 'Sugerowane pakiety nie muszą być instalowane w celu zainstalowania pakietu. Dla pakietu misc, który może być wielką zaletą. Na przykład. użytkownicy mogą korzystać z nieoryginalnej części wegańskiej, nawet jeśli nie można zainstalować rgl na swoim komputerze. W tym przypadku nie są dostępne tylko funkcje wykorzystujące język. – cbeleites

+0

@cbeleites Z tego właśnie powodu Jari Oksanen (wiodący wegański programista) zdecydował się użyć sugestii dla dodatkowych pakietów, których używamy. –

14

Ogólnie staram się unikać używania pakietów require(). Jako sugestię, pracuj z przestrzenią nazw (to nie jest trudne) i używaj Imports: pakiety tam wymienione nie są ładowane. Możesz zaimportować tylko jedną funkcję z innego pakietu przez:

  • przy użyciu deklaracji importFrom w pliku przestrzeni nazw. importFrom(foo, x, y) mówi, że funkcje powinny zostać zaimportowane z pakietu foo.
  • przy użyciu operatora dwukropka w kodzie: foo::bar funkcja importu bar z paczki foo. na przykład. plyr::ddply(...) uzyska dostęp do funkcji ddply bez opakowanie jest załadowane
  • lub potrójne operatora okrężnicy w przypadku przedmiotów, które nie są eksportowane (foo:::bar)

We wszystkich trzech przypadkach, pakiety powinny zostać wymienione importu. Zobacz także odpowiedni rozdział 1.6 i inne w Writing R Extensions.

EDYCJA: Jak zaznaczył @Gavin, wszystko działa tylko wtedy, gdy najwyraźniej importuje się z paczki z własną przestrzenią nazw. Od następnej wersji R na (2.14?) Wszystkie pakiety powinny mieć przestrzeń nazw.

+2

+1 Oznacza to, że pakiet ma NAMESPACE - wiele nie teraz, ale wszystko będzie jak z następnej ważnej wersji R. –

+0

Zobacz również dyskusję tutaj http: //chat.stackoverflow.com/transkrypcja/wiadomość/1143070 # 1143070 –

+0

@Gavin Thx za wskazanie tego. Zaktualizowano odpowiedź. –

Powiązane problemy