【问题标题】:Code organisation in R package developmentR包开发中的代码组织
【发布时间】:2018-10-17 19:56:06
【问题描述】:

R开发包时,所有R源文件都放在R/子目录下,所有编译后的代码都放在src/子目录下。

我想为这些文件夹中的文件添加一些组织,而不是将所有内容都转储到顶层。例如,假设我正在开发一个客户端-服务器应用程序。从逻辑上讲,我想在R/client/ 中组织我所有的客户端R 源文件,在R/server/ 中组织我的所有服务器R 源文件。

开发包时是否可以在子文件夹中组织代码,如果可以,如何? Writing R Extensions 手册不提供任何指导,R CMD build 也不会检测存储在 R/ 下的子文件夹中的文件。

【问题讨论】:

  • 您可以创建两个包 - 一个用于客户端,一个用于服务器。
  • 我可以,但这不是我的重点。

标签: r package


【解决方案1】:

将评论扩展到哈德利恕我直言的错误答案:

查看Matrix 包(由R Core 成员编写),它在src/ 下有五个文件夹,其中两个包含其他子文件夹。另一个例子是由 R Core 成员(共同)编写和维护的 Rsymphony 包。

这样做不适合胆小的人。 R 强烈 更喜欢src/Makevars 片段而不是完整的src/Makefile,以便能够为不同的子架构构建自己的Makefile 版本。但是,如果您知道一点点并且愿意付出努力,这是完全可行的——并且正在完成。

但仍然不推荐。

【讨论】:

  • 你可以把子文件夹放在src/下面,但是你能把它们放在R/下面吗?在我看来,这是一个轻微但重要的区别......
  • R/ 你不能;无论如何,它们都会被整理/解析并以内部格式存储。对于src/,您可以,但有一些(相当大的)痛苦。
  • 仅将子文件夹中的存储代码添加到R/ 并手动将文件添加到DESCRIPTION 文件中的Collate: 字段也不起作用。
  • 您和@hadley 的答案以及以下说明将是一个完整且有用的答案:“R 仅针对 src/ 中的 C/C++ 文件处理代码组织的子文件夹,其中包含一些(TODO:which‽ ) Makevars 已设置,但对于 R/ 中的 R 文件完全没有。”
  • 不,这不是一个有用的答案。
【解决方案2】:

如果没有额外的设置(例如定义自定义 makefile),您将无法使用子文件夹。最好的办法是使用前缀:client-a.rclient-b.rserver-a.rserver-b.r 等。

【讨论】:

  • 当然可以。如果您知道自己在做什么,并且愿意做正确的src/Makevars 的工作。最好的例子可能是Matrix 包,它在src/ 下有五 (5) 个子文件夹,其中一些包括其他文件夹。现在,这会是推荐的方法吗?不,但它 a) 可行 b) 正在完成。
  • @DirkEddelbuettel 当然,如果你足够努力,你可以做任何事情。您甚至可以将所有代码存储在数据库中。
  • 你能不能别傻了。引用我在“编写 R 扩展”中的行或段落 a) 建议使用数据库来存储文件和 b) 禁止使用子文件夹到 src/
  • @DirkEddelbuettel R-ext 不禁止使用子文件夹,但它表示它们也受支持。它也不禁止使用数据库,实际上告诉您您的代码将存储在数据库中。无论如何,我已经调整了我的答案。但我认为您不能在 R/ 目录中使用 makefile。
  • 我明确提到了 Makevars,而不是 Makefile。请不要将错误的陈述归咎于我。
【解决方案3】:

我与 R 核心团队 Allow for sub-folders in "package/R/" directory 争论过。他们似乎并不想改进它。所以我的工作流程如下。

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

【讨论】:

    【解决方案4】:

    识别线程有点老了,我只是想我会提出解决这个问题的方法。请注意,我的问题类似,但我只关心在开发中保留文件夹层次结构。

    在开发中,我将我的脚本文件组织在子文件夹中,以随心所欲,但我没有在生产中对抗 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/ 文件夹在加载之前设置为工作目录脚本文件。

    当然,这个例子有点简单——它假设所有脚本文件依赖项都存在于同一个文件夹中,但设计一个适合更复杂的开发文件夹层次结构的系统似乎是一个简单的问题。

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 2018-10-12
      相关资源
      最近更新 更多