Организация кода в разработке R-пакета
При разработке пакетов в R
все R
исходные файлы помещаются в подкаталог R/
и весь скомпилированный код помещается в подкаталог src/
,
Я хотел бы добавить какую-то организацию к файлам в этих папках, а не создавать все на верхнем уровне. Например, допустим, я гипотетически разрабатываю клиент-серверное приложение. Логично, я хотел бы организовать все мои исходные файлы клиента R в R/client/
и все мои файлы R сервера в R/server/
,
Можно ли организовать код в подпапках при разработке пакета, и если да, то как? Руководство по написанию расширений R не дает никаких рекомендаций и не дает R CMD build
обнаруживать файлы, хранящиеся в подпапках R/
,
4 ответа
Вы не можете использовать подпапки без дополнительной настройки (например, определение собственного make-файла). Лучшее, что вы можете сделать, это использовать префиксы: client-a.r
, client-b.r
, server-a.r
, server-b.r
, так далее.
Расширяя комментарий к ИМХО неправильного ответа Хэдли:
Посмотрите на пакет Matrix (написанный членами R Core), который имеет пять папок ниже src/
и два из них содержат другие подпапки. Другой пример - пакеты Rsymphony (со), написанные и поддерживаемые участником R Core.
Делать это не для слабонервных. R сильно предпочитает src/Makevars
фрагмент по полной src/Makefile
для того, чтобы иметь возможность построить свой собственный Makefile
версии для разных субархитектур. Но если вы знаете немного и хотите приложить усилия, это вполне выполнимо - и это делается.
Это все еще не делает это рекомендованным все же.
Я поспорил с основной командой R Разрешить подпапки в каталоге "package/R/". Кажется, они не очень хотят его улучшить. Так что мой рабочий процесс выглядит следующим образом.
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
...
со мной package.flatten()
функция
3) Затем я устанавливаю сплющенную версию в R.
Я написал простой скрипт для Linux, чтобы сделать все
https://github.com/feng-li/flutils/blob/master/inst/bin/install.HS
Признавая, что тема немного устарела, я просто подумал, что добавлю свое решение этой проблемы. Обратите внимание, что моя проблема похожа, но меня интересует только сохранение иерархий папок при разработке.
В процессе разработки я организовываю свои файлы сценариев в подпапках по своему усмотрению, но вместо того, чтобы бороться с плоской иерархией 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 и сценарий / папка проекта установлены в качестве рабочего каталога перед загрузкой любых файлов сценариев.
Конечно, этот пример немного прост - он предполагает, что все зависимости файла сценария существуют в одной и той же папке, но кажется простой задачей разработать систему, которая бы подходила для более сложных иерархий папок разработки.