Dlaczego i kiedy utworzyć pakiet R?

28

Rozumiem, że to pytanie jest dość szerokie, ale zastanawiam się, jakie powinny być decydujące punkty przy podejmowaniu decyzji o utworzeniu (lub nie) nowego pakietu dla R. Aby być bardziej szczegółowym, dodam, że pytanie nie dotyczy powodów użyj R w sobie, więcej o decyzji o kompilacji różnych skryptów i zintegrowaniu ich w nowym pakiecie.

Wśród kwestii, które mogą prowadzić do tych decyzji, pomyślałem (w dość niewyczerpujący sposób) o:

  • brak innych pakietów w tym samym subpolu;
  • potrzeba wymiany z innymi badaczami i umożliwienia powtarzalności eksperymentów;

A wśród kwestii, które mogą prowadzić do sprzecznej decyzji:

  • część zastosowanych metod jest już obecna w niektórych innych pakietach;
  • liczba nowych funkcji jest niewystarczająca, aby uzasadnić utworzenie nowego niezależnego pakietu.

Mogłem zapomnieć o wielu punktach, które mogłyby znaleźć się na obu listach, a także te kryteria wydają się częściowo subiektywne. Co zatem powiesz, co powinno uzasadnić i w którym momencie zacząć gromadzić różne funkcje i dane w nowym udokumentowanym i szeroko dostępnym pakiecie?

Obozy Jean-Baptiste
źródło

Odpowiedzi:

17

Nie programuję w języku R, ale programuję inaczej i nie widzę tutaj żadnego problemu związanego z językiem R.

Wyobrażam sobie, że większość ludzi najpierw coś pisze, ponieważ naprawdę chcą tego dla siebie. I odwrotnie, każdemu poczuciu, że należy publikować oprogramowanie, ponieważ należy to zrobić, należy zdecydowanie się oprzeć. Mądrzy ludzie mogą być kiepskimi programistami i często nimi są.

Upublicznienie wydaje się sprawą pewności, że masz coś tak dobrego lub lepszego niż to, co już jest publiczne i wypełnia lukę. Świadomość, że inni ludzie chcą robić to samo, jest z pewnością impulsem.

W razie wątpliwości nie publikuj. W wielu społecznościach występuje problem kontroli jakości przeciętnego lub błędnego oprogramowania wydanego przez bezkrytycznych lub niedoświadczonych programistów, chociaż kwestia tego, jak poważny jest problem, pozostaje otwarta na dyskusję. Optymiści uważają, że ciekawostki można po prostu zignorować, a użytkownicy będą wystarczająco szybko ujawniać błędy i ograniczenia; pesymiści uważają, że toniemy w rzeczach złej jakości i ciężko jest odróżnić zwycięzców od przegranych. (Z drugiej strony doświadczenie zdobyte podczas publikacji jest częścią tego, co pozwala programistom się doskonalić.)

Może być na ten temat książka, ale przychodzi mi na myśl kilka wskazówek:

  1. Dokumentacja dobrej jakości wyróżnia dobre oprogramowanie, a także dobry kod, czasem nawet bardziej oczywisty. Nigdy nie lekceważ, ile pracy będzie wymagało dostarczenie dokumentacji, na którą kod zasługuje. Programiści R często wydają się wymagać, aby użytkownicy R wiedzieli tyle samo, co robią na temat wdrażanej techniki i minimalnie dokumentują ...

  2. W miarę możliwości przetestuj swój kod, aby móc odtwarzać opublikowane rozwiązania z prawdziwymi danymi z innych źródeł. (Jeśli kodujesz coś zupełnie nowego, może to być trudniejsze, ale nie niemożliwe. Często możesz się zastanawiać, czy to ich błąd, czy twój.)

  3. Programiści często nie doceniają zdolności użytkowników do rzucania nieodpowiednich danych w programie. Pomyśl więc o tym, co może pójść nie tak, np. Z brakującymi wartościami, zerami, jeśli program przyjmuje wartość dodatnią itp., Itp. (Łagodne podejście polega na tym, że zadaniem użytkowników jest znalezienie problemów i poprawienie kodu za pomocą ich opinii , ale program, który łatwo się psuje, nie poprawi Twojej reputacji).

Nick Cox
źródło
1
Nie mogłem się bardziej zgodzić z tymi trzema punktami (chociaż punkt 2 nie miałby zastosowania w moim konkretnym przypadku, ponieważ zaprojektowałem daną metodę). Trzecia kwestia jest bardzo ważna i ogólnie podnosi kwestię poziomu informacji, których można oczekiwać od użytkownika (lub: dla kogo wypuszczamy pakiet): czy powinniśmy kodować tylko dla specjalistów w tej dziedzinie, znających korzystając z dostępnej metody, czy starasz się, aby nasz pakiet był użyteczny dla zainteresowanych naukowców, którzy nie przeczytali wszystkich powiązanych artykułów?
Jean-Baptiste Camps
2
# 2 zawsze obowiązuje w zakresie „przetestuj kod”! Różni ludzie mają różne style w ostatnim punkcie i nie ma właściwej odpowiedzi. Możesz przyjąć, że nie jest zadaniem programisty wyjaśnianie tego, co jest dobrze wyjaśnione w innym miejscu, lub daremne dokumentowanie programu, z wyjątkiem wyjaśniania użycia. W społeczności Stata, gdzie działam, dobra dokumentacja wydaje się powszechnie doceniana, a jej brak stanowi problem, ale społeczność R musi mieć własne obyczaje.
Nick Cox
o informowaniu zwycięzców od przegranych i o twoich bardzo ważnych punktach: # 1: na szczęście jest kilka punktów w R, które można łatwo sprawdzić, i które wskazują na lepszą dokumentację niż tylko wymagane formalnie strony pomocy. Czy dostarczono winietę ( sos::findFnuznaje to kryterium za wystarczająco ważne, aby umieścić te informacje w tabeli wyników!)? Demo? Strona internetowa z dodatkowymi informacjami? Czy citationdać odpowiedni papier lub rezerwacji nr 2 można wysyłać przykładowe dane z kodem, więc nawet jeśli nie ma innego realizacja można przetestować swój kod przed, teraz inni mogą przetestować ich realizacji przed Ciebie.
cbeleites wspiera Monikę
1
„Programiści R często wydają się wymagać, aby użytkownicy R wiedzieli tyle samo, co robią na temat implementowanej techniki i minimalnie dokumentują ...” - Ważne jest, aby odróżnić dokumentację kodu od metody statystycznej . Dokumentacja R absolutnie nie jest miejscem do nauki metod statystycznych. Nawet winiety zakładają pewien poziom wyrafinowania. Zbyt wiele skarg na minimalną dokumentację w języku R naprawdę sprowadza się do narzekania, że ​​doktorzy nie łyżką karmią ich wiedzą statystyczną.
joran
2
Elipsa ... miała na celu zasygnalizować skrzywienie. Społeczność R musi ustalić własne standardy lub przynajmniej je omówić.
Nick Cox
14

To ważne i praktyczne pytanie. Zacznijmy od rozróżnienia między pisaniem pakietu a publikowaniem go w CRAN.

Powody, dla których nie pisać paczki:

  • Efektywność kosztowa.
  • Brak doświadczenia.

Powody, dla których warto napisać pakiet R:

  • Udostępnianie ludziom i platformom.
  • Wymusza uporządkowanie kodu i proces pracy.
  • Łatwość użycia (nawet dla siebie), gdy funkcje zaczynają się kumulować.

Powody, dla których należy przesłać pakiet (CRAN, Bioconductor, ...):

  • Wkład w społeczność.
  • Łatwość dystrybucji.
JohnRos
źródło
7
Dodam, że brak doświadczenia jest również powodem do napisania pakietu R. Pisanie pakietu po raz pierwszy jest nie tylko zabawą i wyzwaniem, ale pomaga sformułować pomysły na temat zaprojektowania „właściwego” pakietu, który będzie użyteczny dla siebie i społeczności. Innymi słowy, nawet jeśli brakuje doświadczenia, dobrym pomysłem jest napisanie pakietu, aby zdobyć doświadczenie.
Graeme Walsh
1
Twój pogląd, Grame, jest dość motywujący dla niezbyt doświadczonego programisty R, który wahałby się przed zaprojektowaniem pakietu. Z drugiej strony, choć z pewnością byłoby to dla siebie satysfakcjonujące, zauważam, że obie odpowiedzi podkreślają (i rozumiem to również) programową i naukową potrzebę czystego, wydajnego i ponad wszystko wolnego od błędów kodu. To otwiera nowe pytanie, które może brzmieć: „Jak upewnić się, że pakiet R jest wolny od błędów?”, Podobno zadanie społeczności, ale rosnąca liczba nowych pakietów może to ograniczać.
Jean-Baptiste Camps
To zdecydowanie wraca do twojego punktu, że istnieje dość różnica między pisaniem pakietu (powiedzmy, aby zdobyć doświadczenie) a faktycznym zrobieniem następnego kroku i opublikowaniem pakietu. cbeleites mówi nam, że czyni swoje pakiety „półpublicznymi” i myślę, że jego podejście zawiera elementy, jak upewnić się, że pakiet R jest wolny od błędów (a raczej, że możliwość wystąpienia błędów jest zminimalizowana). Zasadniczo pewien rodzaj fazy recenzowania lub testowania jest jednym ze sposobów, aby upewnić się, że pakiety R są dobrej jakości. Jeśli pojawi się zbyt wiele pakietów bez recenzji, mogą one nie być tak przydatne.
Graeme Walsh
12

Pamiętaj, że istnieje opcja # 3; możesz poprosić opiekuna odpowiedniego pakietu o podanie kodu lub danych.


źródło
8

Moje osobiste wyzwalacze do pakowania to:

  • Zauważyłem, że ponownie używam kodu, który napisałem kiedyś do innego projektu analizy danych.
  • Myślę, że będę potrzebować metody, którą właśnie napisałem.
  • Kolega prosi mnie o kod. Znaczna część kodu, który piszę, jest przynajmniej tyle na prośbę kolegów (którzy używają R, ale sami nie programują tak dużo) jak dla mnie.

  • Używam formalnych wymagań dotyczących pakietu (dokumentacji), aby „zmusić” mnie do wyczyszczenia i udokumentowania mojego kodu.

Zgadzam się z @JohnRos, że istnieje duża różnica między pisaniem pakietu a jego publikowaniem.

  • Zazwyczaj pakuję wcześnie, ale potem robię to tylko „półpubliczne”. Oznacza to, że może być dostępny na serwerze wewnętrznym (lub na r-forge), aby moi koledzy mieli dostęp do pakietu. Ale publikuję w CRAN dopiero po tym, jak pakiet był używany przez miesiące lub nawet kilka lat przez bliskich współpracowników. To nie wywołuje wszystkich błędów zgodnie z punktem 3 Nicka Coxa, ale spora ich liczba.
    Wersje pakietu (wstawiam datę po myślniku w numerze wersji) ułatwiają naprawianie rzeczy („aby to zrobić i tamto, upewnij się, że instalujesz przynajmniej wersję z zeszłego tygodnia”)

  • Zgodnie z moją umową o pracę mój pracodawca ma ostatnie słowo na temat tego, czy i jak pakiet może zostać opublikowany na zewnątrz.

Rzeczą, gdzie ja nie jeszcze dobrą strategię na opakowaniu jest dane.


Komentarze do twojej listy powodów:

  • brak innych pakietów w tym samym subpolu;

Nie znalezienie pakietu, który robi to, czego potrzebuję, powoduje napisanie kodu, ale nie ma to związku z decyzją, czy go spakować, czy nie.

  • potrzeba wymiany z innymi badaczami i umożliwienia powtarzalności eksperymentów;

Zdecydowanie. Być może już potrzebuję współdzielić kilka komputerów, z których korzystam.

A wśród kwestii, które mogą prowadzić do sprzecznej decyzji:

  • część zastosowanych metod jest już obecna w niektórych innych pakietach;

możesz zaimportować te metody do swojego pakietu / kodu: jest to argument przeciwko pisaniu takiego kodu, ale tylko pośrednio dotyczy pakowania.

  • liczba nowych funkcji jest niewystarczająca, aby uzasadnić utworzenie nowego niezależnego pakietu.

Dla mnie nie ma minimalnej liczby funkcji do uruchomienia pakietu. Z mojego doświadczenia wynika, że ​​pakiety rosną „automatycznie”. Wręcz przeciwnie, po tym, jak kilka razy rozgałęziłem nowy pakiet z innego (ponieważ np. Niektóre funkcje pomocnicze okazały się być tematycznie różne i przydatne również w innych sytuacjach), teraz jestem raczej natychmiastowe tworzenie nowych pakietów.

Ponadto, jeśli nie napisałeś dokumentacji i testów, może to być zbyt duża ilość pracy, gdy zgromadzi się „wystarczająca” liczba funkcji do utworzenia pakietu.
(Jeśli napiszesz je natychmiast, dodatkowy wysiłek włożenia go do pakietu jest znikomy, gdy poznasz przepływ pracy).

cbeleites obsługuje Monikę
źródło
3
+1. Innym dobrym sposobem na uczynienie pakietów półpublicznymi jest umieszczenie źródła pakietu na GitHub - ułatwia to znajdowanie kodu i zachęca innych do współtworzenia bez ukrytego dopracowywania pakietu w CRAN.
Matt Parker
7

Powiedziałbym, że stwórz pakiet za każdym razem, gdy wykonujesz wystarczająco duży zestaw podobnych zadań w R, aby skorzystać z pakietu, w którym możesz umieścić rzeczy w przestrzeni nazw (aby uniknąć konfliktów z funkcjami o podobnych nazwach), w których możesz pisać dokumentacja. Mam nawet pakiet na github do pakowania pakietu funkcji, które nie są powiązane, ale używam tak często, że myślałem, że zasługują na dokumentację, pliki man itp.

Innym przypadkiem użycia może być przesłanie artykułu, jeśli masz wiele funkcji, możesz łatwo stworzyć pakiet, w tym dokumentację dla tych funkcji, przykłady dla każdej funkcji i samouczek, jak z niej korzystać. I nie musisz umieszczać go w CRAN, jak powiedziano w powyższych odpowiedziach. Może to być niesamowite ze względu na powtarzalność.

Ważne są trzy narzędzia:

  • devtools pkg , aby ułatwić tworzenie pakietów (zobacz także wiki na stronach github devtools
  • roxygen2 pkg , aby ułatwić pisanie dokumentacji dla paczki
  • GitHub, możesz użyć install_github(lub podobnie install_bitbucket itp.), Aby zainstalować bezpośrednio z GitHub, co jest miłe do udostępniania innym.
szkocki
źródło
5

Zgadzam się ze wszystkim, co czytałem do tej pory. Wszystkie te powody są dobrą praktyką programowania i nie dotyczą w szczególności R. Jednak najczęściej piszę pakiety R i to z innego powodu. Dodam więc:

Powód dla którego należy napisać pakiet R:

  • ponieważ piszesz w C.

Za każdym razem, gdy używasz języków obcych, takich jak C, C ++ lub FORTRAN (głównie do obliczeń o wysokiej wydajności), napisanie pakietu jest w dużej mierze warte kłopotu. Jeśli masz więcej niż jedną lub dwie funkcje, szybko dostajesz pliki w dowolnym miejscu i zależności między kodem R i C, które są trudne do utrzymania i przeniesienia.

gui11aume
źródło
0

Jeden powód nie wymieniony w innych doskonałych odpowiedziach: Masz duży lub złożony projekt analizy danych. Najpierw pakowanie danych jako pakiet, a następnie rozszerzanie o przydatne funkcje do przekształcania, kreślenia lub obliczania konkretnych analiz. W ten sposób otrzymujesz udokumentowaną wersję danych wraz ze wszystkimi funkcjami użytymi do obliczenia raportowanej analizy. Następnie raport (y) z projektu można napisać przy użyciu knitr lub innych pakietów do powtarzalnych badań!

Może to znacznie zaoszczędzić czas, jeśli trzeba przeprowadzić ponowną analizę, a nawet może zostać opublikowane (lub częściowo opublikowane), jeśli analiza zostanie opublikowana.

kjetil b halvorsen
źródło