2013-09-03 15 views
18

Podczas tworzenia pakietów w R wszystkie pliki źródłowe R są umieszczane w podkatalogu R/, a cały skompilowany kod jest umieszczany w podkatalogu src/.Organizacja kodu w rozwoju pakietu R

Chciałbym dodać organizację do plików w tych folderach, zamiast umieszczać wszystko na najwyższym poziomie. Na przykład, powiedzmy, że hipotetycznie rozwijam aplikację klient-serwer. Logicznie, chciałbym zorganizować wszystkie moje pliki źródłowe R klienta w R/client/ i wszystkie moje pliki źródłowe R serwera w R/server/.

Czy można organizować kod w podfolderach podczas tworzenia pakietu, a jeśli tak, to w jaki sposób? Podręcznik Writing R Extensions nie oferuje żadnych wskazówek, ani nie wykrywa plików przechowywanych w podfolderach pod numerem R/.

+3

Można utworzyć dwa pakiety - jeden dla klienta i jeden dla serwera. –

+4

Mogłem, ale nie o to mi chodzi. –

Odpowiedz

7

Nie można korzystać z podfolderów bez dodatkowej konfiguracji (np. Definiowanie niestandardowego pliku Makefile). Najlepsze co możesz zrobić, to użyć prefiksów: client-a.r, client-b.r, server-a.r, server-b.r itd

+2

** Ale oczywiście możesz **. Jeśli wiesz, co robisz, i jesteś gotów wykonać legwork poprawnego 'src/Makevars'. Najlepszym przykładem może być pakiet [Matrix] (http://cran.r-project.org/package=Matrix), który ma pięć (5) podfolderów poniżej 'src /', a niektóre z nich zawierają inne foldery. Teraz byłoby to zalecane podejście. Nie, ale a) wykonalne i b) gotowe. –

+3

@DirkEddelbuettel Oczywiście możesz zrobić wszystko, jeśli spróbujesz wystarczająco mocno. Możesz nawet przechowywać cały kod w bazie danych. – hadley

+0

Nie możesz, ponieważ CRAN nie zaakceptuje bazy danych. Ale akceptuje pakiety z podfolderami. –

9

rozszerzenie komentarz IMHO błędnej odpowiedzi Hadley:

Spójrz na opakowaniu Matrix (napisany przez członków R rdzenia), które ma pięć folderów poniżej src/, a dwa z nich zawierają inne podfoldery. Innym przykładem są pakiety Rsymphony (współ) napisane i utrzymywane przez członka R Core.

Nie robimy tego dla osób o słabym sercu. R zdecydowanie preferuje fragment src/Makevars na pełnym src/Makefile, aby móc skonstruować własne wersje Makefile dla różnych podarchitektur. Ale jeśli wiesz, że masz niewielki wpływ i jesteś gotów włożyć ten wysiłek, jest to całkowicie wykonalne - i gotowe.

Mimo to nadal nie jest to zalecane.

+1

możesz umieścić podfoldery poniżej 'src /', ale czy możesz umieścić je poniżej 'R /'? Wydaje mi się, że to niewielkie, ale ważne rozróżnienie ... –

+0

Dla 'R /' nie możesz; zostaną one zebrane i przeanalizowane i zapisane w formacie wewnętrznym. Dla 'src /' możesz, z pewnym (znacznym) bólem. –

+0

Po prostu dodawanie, że przechowywanie kodu w podfolderach do 'R /' i ręczne dodawanie plików do pola 'Collate:' w pliku 'DESCRIPTION' nie działa. –

1

Rozpoznanie wątku jest nieco stare, po prostu pomyślałem, że wrzucę moje rozwiązanie tego problemu. Zauważ, że mój problem jest podobny, ale interesuje mnie tylko zachowanie hierarchii folderów podczas programowania.

W trakcie projektowania organizuję moje pliki skryptów w podfolderach do zawartości mojego serca, ale zamiast walczyć z płaską hierarchią R w produkcji, dodałem własną "stałą czasu kompilacji", że tak powiem.

Oznacza to, że w każdym pliku znajduje się w podkatalogu (nie w skryptach najwyższego szczebla /), dodaję następujące:

if (!exists("script.debug")) 
    script.debug = FALSE 

Następnie załadować cokolwiek inne zależności są wymagane, co następuje:

source.list <- c(
      "script_1.R", 
      "script_2.R", 
      "script_3.R", 
      "script_4.R" 
      ) 

if (script.debug) 
    source.list <- paste("./script_subfolder/", source.list, sep="") 

lapply(source.list, source) 

Domyślnym założeniem jest, że kod jest w trakcie produkcji, (source.debug = FALSE), więc podczas tworzenia upewnij się, że source.debug = TRUE, a skrypt/folder projektu jest ustawiony jako katalog roboczy przed ładowanie dowolnych plików skryptów.

Oczywiście ten przykład jest trochę prosty - zakłada, że ​​wszystkie zależności plików skryptowych istnieją w tym samym folderze, ale wydaje się, że prostym problemem jest zaprojektowanie systemu, który pasowałby do bardziej skomplikowanych hierarchii folderów programistycznych.

0

Kłóciłem się z głównym zespołem R [Zezwalaj na podfoldery w katalogu "pakiet/R /"] [https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17258]. Wydaje się, że tak naprawdę nie chcą go ulepszać. Więc mój przepływ pracy jest następujący.

1) Utwórz projekt R samo jak inne pakiety, ale pozwalają podkatalogów w folderze R/ takich jak

R/mcmc/a.R R/mcmc/b.R R/prediction/p1.R R/predection/p2.R

2) Kiedy trzeba je zapakować, przekonwertować wszystkie pliki pod R/ jak

R/mcmc_a.R R/mcmc_b.R R/prediction_p1.R R/predection_p2.R ...

3) Potem zainstalować wersję płaską do R.

napisałem prosty skrypt dla Linuksa zrobić wszystko

https://github.com/feng-li/flutils/blob/master/inst/bin/install.HS