代码之家  ›  专栏  ›  技术社区  ›  JohnA

开发一套相关R包的最佳实践

  •  2
  • JohnA  · 技术社区  · 8 年前

    我开始研究一系列R包,所有这些包共享大量的公共代码,这些代码都包含在自己的包中,我们称之为 myPackageUtilities 。所以我有几个包裹

    myPackage1 , myPackage2

    所有这些包都依赖于 myPackage实用程序 。有关真实世界的示例,请参见 statnet on CRAN 。这个想法是,未来的开发人员可能会创建 myPackageN ,未来的开发人员可以简单地使用 mypackageUtilities 开始。

    存在并发症:

    1) 一些 代码的 mypackage实用程序 用于最终用户,其余用于内部开发目的。最终用户代码需要使用roxygen2进行适当的记录。该代码包括S3类和泛型,以及用户的各种帮助函数。

    2) 依赖包( 我的软件包1 , 我的软件包2 等)可能会扩展中定义的S3泛型 myPackage实用程序 .

    我的问题是: 组装这一切的最佳方法是什么?这里有两个自然(但非劝诫性)选项:

    1. 包括 mypackage实用程序 在“导入”下:针对所有依赖包,并强制用户单独加载 mypackage实用程序 ,
    2. 包括 mypackage实用程序 在“依赖”下:对于所有依赖的包,并对从中导出的内容进行选择 mypackage实用程序 以避免搜索路径混乱。所有内部(非导出)代码都必须通过 ::: 在里面 我的软件包1

    我最初问了一个类似的问题 over here ,但很快发现情况变得很复杂。例如:

    • 如果我们使用Imports:而不是Depends:,那么 mypackage实用程序 未被发现 我的软件包1
      • 这使得使用 mypackage实用程序 困难/不可能,并且几乎违背了整个设置的目的。
    • 如果我在中定义S3泛型 mypackage实用程序 并将其记录在那里,我如何让roxygen2在 我的软件包1 ?

    也许我深深地误解了名称空间是如何工作的,在这种情况下,这将是一个很好的地方来消除我的误解!

    1 回复  |  直到 7 年前
        1
  •  2
  •   Benjamin    8 年前

    欢迎来到兔子洞。

    您可能会惊讶地发现,您可以从 myPackageUtilities 进入 myPackage1 然后从导出 我的软件包1 使其能够从全球环境中访问。

    所以,当你说你在 myPackage实用程序 我的软件包1 已加载,这是我将在文档中包含的内容 fn_name 在里面 我的软件包1

    #' @importFrom myPackageUtilities fn_name
    #' @export fn_name
    

    (参见 https://github.com/hadley/dplyr/blob/master/R/utils.r 例如)

    这仍然留下了如何链接到原始文档的问题。恐怕我没有一个好的答案。我目前的做法基本上是从原始源复制参数文档,然后在我的 @details 区段写入 please see the documentation for \code{\link[myPackageUtilities]{fn_name}}

    最后,我仍然认为你最好的选择是从 myPackage实用程序 永远不会在外面使用 myPackage实用程序 并在每个需要函数的包中进行组合导入导出 myPackage实用程序 可以从全球环境中访问。