开发包时R
所有R
源文件都放在子目录R/
下,所有编译好的代码都放在子目录下src/
。
我想为这些文件夹中的文件添加一些组织,而不是将所有内容都转储在顶层。例如,假设我正在开发一个客户端-服务器应用程序。从逻辑上讲,我想将所有客户端 R 源文件R/client/
和所有服务器 R 源文件组织在R/server/
.
开发包时是否可以在子文件夹中组织代码,如果可以,如何?编写 R 扩展手册不提供任何指导,也不 R CMD build
检测存储在R/
.
将评论扩展到哈德利的恕我直言不正确的答案:
查看Matrix包(由 R Core 成员编写),它有以下五个文件夹src/
,其中两个包含其他子文件夹。另一个例子是由 R Core 成员编写和维护的Rsymphony包(共同)。
这样做不适合胆小的人。R强烈喜欢src/Makevars
片段而不是完整src/Makefile
的,以便能够Makefile
为不同的子架构构建自己的版本。但是如果你知道一点点并且愿意付出努力,这是完全可行的 - 并且正在完成。
尽管如此,这仍然不推荐。
如果没有额外的设置(如定义自定义 makefile),您将无法使用子文件夹。你能做的最好的就是使用前缀:client-a.r
, client-b.r
, server-a.r
, server-b.r
, 等等。
我与 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 并且在加载任何脚本文件之前将项目的 script/ 文件夹设置为工作目录。
当然,这个例子有点简单——它假设所有脚本文件依赖项都存在于同一个文件夹中,但设计一个适合更复杂的开发文件夹层次结构的系统似乎是一个简单的问题。