Подтвердить что ты не робот

Организация кода в разработке R-пакета

При разработке пакетов в R все исходные файлы R помещаются в подкаталог R/, а весь скомпилированный код помещается в подкаталог src/.

Я хотел бы добавить некоторую организацию в файлы в этих папках, вместо того, чтобы все было сброшено на верхнем уровне. Например, допустим, что я гипотетически разрабатываю клиент-серверное приложение. Логически, я хотел бы организовать все исходные файлы моего клиента R в R/client/ и все исходные файлы моего сервера R в R/server/.

Можно ли организовать код во вложенных папках при разработке пакета, и если да, то как? Руководство Написание R-расширений не предлагает никаких указаний, а также R CMD build обнаруживает файлы, хранящиеся в подпапках под R/.

4b9b3361

Ответ 1

Вы не можете использовать подпапки без дополнительной настройки (например, определение пользовательского make файла). Лучше всего использовать префиксы: client-a.r, client-b.r, server-a.r, server-b.r и т.д.

Ответ 2

Расширение комментария к неверному ответу Хэдли IMHO:

Посмотрите на Matrix пакет (написанный членами R Core), который имеет пять папок ниже src/, а два из них содержат другие подпапки. Другим примером является Rsymphony пакеты (co), записанные и поддерживаемые членом R Core.

Делать это не для слабонервных. R сильно предпочитает фрагмент src/Makevars поверх полного src/Makefile, чтобы иметь возможность создавать собственные версии Makefile для разных субархитектур. Но если вы знаете немного, и готовы приложить усилия, это полностью выполнимо - и делается.

Это все еще не рекомендуется.

Ответ 3

Признание потока немного устарело, я просто подумал, что я бы выбрал решение этой проблемы. Обратите внимание, что моя проблема аналогична, но я беспокоюсь только о сохранении иерархии папок в разработке.

В разработке я организую файлы script в подпапках для моего сердечного контента, но вместо того, чтобы бороться с плоской иерархией R в производстве, я добавил, например, свою собственную "константу времени компиляции".

То есть в каждом файле, расположенном во вложенной папке (не в сценариях верхнего уровня /), я добавляю следующее:

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

Затем я загружаю любые другие зависимости, как указано ниже:

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)

По умолчанию предполагается, что код находится в производстве (source.debug = FALSE), поэтому при разработке просто убедитесь, что source.debug = TRUE, а папка проекта script/установлена ​​как рабочий каталог до загрузка любых script файлов.

Конечно, этот пример немного прост - он предполагает, что все зависимые файлы script существуют в одной и той же папке, но, похоже, простая проблема заключается в разработке системы, которая бы соответствовала более сложным иерархиям папок разработки.

Ответ 4

Я спорил с основной командой R [Разрешить для подпапок в каталоге "package/R/" ] [https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17258]. Они, похоже, не хотят улучшать его. Итак, мой рабочий процесс выглядит следующим образом.

1) Создайте проект R так же, как и другие пакеты, но разрешите подкаталоги в папке R/, например

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

2) Когда мне нужно их упаковать, я конвертирую все файлы под R/ как

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

3) Затем я устанавливаю плоскую версию в R.

Я написал простой script для Linux, чтобы сделать все

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