2011-10-24 5 views
12

Jeśli jesteś autorem paczki, masz nadzieję, że wiesz o nadchodzących zmianach w strukturze paczki, gdy przejdziemy do 2,14 w ciągu około tygodnia. Jedną ze zmian jest to, że wszystkie pakiety będą wymagały NAMESPACE, a jedna będzie wygenerowana dla Ciebie w przypadku, gdy go nie stworzysz (ekwiwalent R twoich praw Miranda w USA). Będąc dobrym obywatelem, próbowałem to rozgryźć. Tutaj odcinek z R ekstrahowane:Nadchodzące NAMESPACE, Zależy, Importuje zmiany dla 2.14.0 (niektóre definicje/użycia proszę)

1.6.5 Podsumowanie - przekształcenie istniejącej pakiet

Podsumowując, przekształcenie istniejącej pakiet używać nazw obejmuje kilka prostych kroków

zidentyfikować definicje publiczne i umieść je w dyrektywach eksportowych. Identyfikuj definicje metod w stylu S3 i napisz odpowiednie deklaracje S3method . Zidentyfikuj zależności i zamień wszystkie wymagane połączenia za pomocą dyrektyw importowania (i wprowadź odpowiednie zmiany w polach importu pliku DESCRIPTION: Depends i ). Zamień funkcje .First.lib na z funkcjami .onLoad lub użyj dyrektywDynLib.

Aby upewnić się, że zrobię to, co właściwe, czy ktoś może podać krótką jasną definicję/odpowiedź (czy łamie regułę, łącząc kilka małych, ale powiązanych ze sobą pytań?). Wszystkie odpowiedzi powinny 2.14 pod uwagę, należy:

  1. definicję przestrzeni nazw stosowany przez R
  2. Czy istnieje sposób, aby wygenerować namespace uprzedniej zbudować i sprawdzić, czy też b/c raz, a potem edytować NAMESPACE utworzoną automatycznie?
  3. Różnica między "Depends:" i "Imports:" w pliku DESCRIPTION. W szczególności, dlaczego miałbym umieścić pakiet w "Depends:" zamiast "Imports:" lub na odwrót?
  4. Wygląda na to, że "wymaga" nie jest już używane, chociaż nie mówi tego. Czy to jest właściwa interpretacja?

Dzięki!

Odpowiedz

8

Napisałem trochę na ten temat na https://github.com/hadley/devtools/wiki/Namespaces.

Aby odpowiedzieć na Twoje pytania:

  1. odpowiedzieć Zobacz Dirka.
  2. Użyj roxygen2
  3. Teraz, gdy każdy pakiet ma przestrzeń nazw, nie ma powodu, aby używać Depends.
  4. require powinny być wykorzystywane tylko do załadowania sugerowane pakiety
+0

Dzięki, wiki było pomocne. –

7

Pakiety CRAN miały nazwy NAMESPACE od prawie nieśmiertelnego czasu. Po prostu wybierz kilka swoich ulubionych pakietów CRAN i spójrz na ich pliki NAMESPACE.

To może być tak proste, jak ten jeden-liner (plus komentarz) pobrana z snow:

# Export all names unless they start with a dot 
exportPattern("^[^.]") 

Bieg R CMD check jak zwykle, i powinno być w porządku w większości przypadków.

+0

Kolejny Dirk, o roli NAMESPACE: Co należy wyeksportować? Domyślam się, że większość funkcji, ale nie mogę znaleźć żadnego miejsca, które mówi to wyraźnie. Na przykład w śniegu decydują się one ukryć funkcje, ale wszystkie pozostałe będą "widoczne dla użytkownika"? Funkcje. Są właściwie również widoczne dla użytkownika, prawda, jeśli wiesz, jak szukać? –

+0

To jest twoja decyzja projektowa jako opiekun. Zazwyczaj wszystko, co napisałeś, jest przeznaczone dla użytkownika, dlatego symbol wieloznaczny bardzo pomaga. Otrzymuje wszystko, co zaczyna się od litery, ale nadal pozwala ukryć identyfikatory zaczynając od kropki. –

+3

Należy zauważyć, że zostałem Ripleyed na ten temat (http://tolstoy.newcastle.edu.au/R/e13/devel/11/03/0651.html): "Uważa się, dobrej praktyki, aby nie używać exportPattern() (przynajmniej nie dla szeroko zdefiniowanych wzorów) w kodzie produkcyjnym: zobacz aktualne rozszerzenia 'Pisanie R'. W przeciwnym razie rzeczy mogą się zmienić pod Tobą (to, co ostatnio zmienił nlme export, stąd to, co importuje (nlme) przynosi). " –

4

Zamierzam odpowiedzieć na moje własne pytanie z kilkoma szczegółami nauczyłem po włączeniu przez kilka pakietów do R 2.14.

Powyższy opis z manualnego rodzaju daje wrażenie, że cokolwiek masz w Depends: dla R 2.13 należy przenieść do Importu: w R 2.14. Powinieneś to zrobić, ale nie są one 1-za-1 funkcjonalnie takie same, jak mam nadzieję, będzie jasne z poniższych uwag.

Zaczynamy:

Wymaga: prawdopodobnie powinien być używany tylko do ograniczeń w wersjach, jak „R> = 2,10” lub „MASS> 0,1” i nic innego pod R 2.14.

Posiadanie przestrzeni nazw jest częściowo mechanizmem powiadamiania użytkowników, że mogą występować konflikty nazw i "zamienniki" - innymi słowy nadpisywanie używanych nazw. Plik NAMESPACE musi pasować do elementów i w kolejności w polu Imports: DESCRIPTION. Nazwy funkcji, które zostały zaimportowane, zostaną wyświetlone w sekcji "załadowane przez przestrzeń nazw (i niepowiązane)" w sessionInfo(). Pakiety te są zainstalowane, ale nie są załadowane (tzn. Brak biblioteki (niektóre zaimportowane pakiety)).

Inną rolą przestrzeni nazw jest udostępnienie funkcji "wewnętrznie". Rozumiem przez to, że jeśli twój pakiet użyje funkcji w zaimportowanym pakiecie, zostanie odnaleziony.

Jednak, gdy masz przykład w pliku .Rd, który ma być uruchamiany podczas sprawdzania, pakiety, które były używane w Zależności: w wersji R 2.13, ale teraz znajdują się w Importach: w wersji R 2.14 są niedostępne. Wynika to z faktu, że środowisko sprawdzania jest podobne do pozyskiwania skryptu w czystym środowisku (zakładając, że używasz R --vanilla, więc .Rprofiles itp. Nie zostały uruchomione). Jeśli w twoim przykładzie nie wstawisz instrukcji library (needed package), to nie będzie działać w wersji 2.14, nawet jeśli jest to zgodne z R 2.13. Tak więc stare przykłady niekoniecznie działają, nawet jeśli twój pakiet Importuje: potrzebne pakiety, ponieważ znowu Import: nie jest taki sam jak Zależy: (ściśle, są one dołączone, ale nie załadowane).

Proszę mnie poprawić, jeśli coś z tego jest nie tak. Wielkie dzięki dla Hadley Wickham i innych, którzy mi pomogli!

1

Ostatnio pracowałem nad tym w jednym z moich pakietów. Oto moje nowe zależy, import i sugeruje linie

Depends: R (>= 2.15.0) 
Imports: nlme, mvtnorm, KFAS (>= 0.9.11), stats, utils, graphics 
Suggests: Hmisc, maps, xtable, stringr 

statystyki utils i grafika są częścią bazową R, ale użytkownik może je odłączyć i wtedy mój pakiet nie będzie działać. Jeśli użyjesz R z wiersza poleceń, możesz pomyśleć "dlaczego ktoś miałby je odłączyć?". Ale jeśli użytkownik używa RStudio, powiedzmy, że widzę, jak przechodzą i "usuwają" wszystkie pakiety. Dziwne, ale nie chcę, żeby moja paczka przestała działać, jeśli to zrobią. Mogą też na nowo zdefiniować, powiedzmy, funkcję fabuły (lub jakąś inną funkcję), a wtedy moja paczka zawiedzie.

Moja NAMESPACE ma wówczas następujące linie

import(KFAS) 
import(stats) 
import(utils) 
import(graphics) 

nie chcę przejść i śledzić statystyki, z których utils i graficzne funkcje używam, więc importować całe przestrzenie nazw. W przypadku KFAS potrzebuję tylko 2 funkcji, ale wyeksportowane nazwy funkcji zmieniły się między wersjami, więc zaimportowałem całą przestrzeń nazw, a następnie testowałem w kodzie, którą wersję ma użytkownik.

Dla mvtnorm i nlme, używam tylko jednej funkcji, więc importuję tylko te.Mogłabym zaimportować całą przestrzeń nazw, ale spróbuj zaimportować tylko to, czego naprawdę używam.

importFrom(mvtnorm, rmvnorm) 
importFrom(nlme, fdHess) 

winiet gdzie suggests pakietów pojawiają mieć

linie w nich.

Dla wyeksportowanych funkcji w mojej aplikacji NAMESPACE, jestem trochę rozdarta. CRAN stał się surowy, nie dopuszczając ::: w kodzie Twojego pakietu. Oznacza to, że jeśli nie wyeksportuję funkcji, ograniczam ponowne użycie kreacji. Z drugiej strony, rozumiem potrzebę eksportowania tylko funkcji, które zamierzasz utrzymywać ze stabilną listą arg i wyjściem, w przeciwnym razie łamiemy nawzajem swoje pakiety, zmieniając interfejs funkcji.