Ответ 1
Вы не можете использовать подпапки без дополнительной настройки (например, определение пользовательского make файла). Лучше всего использовать префиксы: client-a.r
, client-b.r
, server-a.r
, server-b.r
и т.д.
При разработке пакетов в R
все исходные файлы R
помещаются в подкаталог R/
, а весь скомпилированный код помещается в подкаталог src/
.
Я хотел бы добавить некоторую организацию в файлы в этих папках, вместо того, чтобы все было сброшено на верхнем уровне. Например, допустим, что я гипотетически разрабатываю клиент-серверное приложение. Логически, я хотел бы организовать все исходные файлы моего клиента R в R/client/
и все исходные файлы моего сервера R в R/server/
.
Можно ли организовать код во вложенных папках при разработке пакета, и если да, то как? Руководство Написание R-расширений не предлагает никаких указаний, а также R CMD build
обнаруживает файлы, хранящиеся в подпапках под R/
.
Вы не можете использовать подпапки без дополнительной настройки (например, определение пользовательского make файла). Лучше всего использовать префиксы: client-a.r
, client-b.r
, server-a.r
, server-b.r
и т.д.
Расширение комментария к неверному ответу Хэдли IMHO:
Посмотрите на Matrix пакет (написанный членами R Core), который имеет пять папок ниже src/
, а два из них содержат другие подпапки. Другим примером является Rsymphony пакеты (co), записанные и поддерживаемые членом R Core.
Делать это не для слабонервных. R сильно предпочитает фрагмент src/Makevars
поверх полного src/Makefile
, чтобы иметь возможность создавать собственные версии Makefile
для разных субархитектур. Но если вы знаете немного, и готовы приложить усилия, это полностью выполнимо - и делается.
Это все еще не рекомендуется.
Признание потока немного устарело, я просто подумал, что я бы выбрал решение этой проблемы. Обратите внимание, что моя проблема аналогична, но я беспокоюсь только о сохранении иерархии папок в разработке.
В разработке я организую файлы 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 существуют в одной и той же папке, но, похоже, простая проблема заключается в разработке системы, которая бы соответствовала более сложным иерархиям папок разработки.
Я спорил с основной командой 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