开发一套依赖R包的最佳实践

时间:2016-01-31 19:22:42

标签: r dependencies packages roxygen2

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

myPackage1myPackage2等......

所有这些包都依赖于myPackageUtilities中的每个方法。有关实际示例,请参阅statnet on CRAN。我们的想法是,未来的开发人员可能会创建myPackageN,而不必重新编写/复制所有支持代码,这个未来的开发人员只需使用mypackageUtilities即可开始。

有并发症:

1) mypackageUtilities中的一些代码适用于最终用户,其余用于内部开发目的。需要使用roxygen2正确记录最终用户代码。此代码包括S3类和泛型,以及用户的各种帮助函数。

2)依赖包(myPackage1myPackage2等)可能会扩展myPackageUtilities中定义的S3泛型。

我的问题是:汇集所有这些内容的最佳方式是什么?这里有两个自然(但非解除)的选择:

  1. 在Imports下包含mypackageUtilities:对于所有相关包,并强制用户单独加载mypackageUtilities
  2. 包含mypackageUtilities取决于所有依赖包,并对mypackageUtilities导出的内容非常有选择性,以避免混乱搜索路径。所有内部(非导出)代码都必须通过:::等中的myPackage1进行访问。
  3. 我最初问了一个类似的问题over here,但很快发现情况变得很复杂。例如:

    • 如果我们使用Imports:而不是Depends :,则mypackageUtilities等找不到myPackage1中定义的任何通用符号等。
      • 这使得使用mypackageUtilities提供的通用模板很难/不可能,几乎无法完成整个设置的目的。
    • 如果我在mypackageUtilities中定义S3通用并在那里记录,我怎样才能在myPackage1中让roxygen2引用这些文档?

    也许我对命名空间的工作方式深感误解,在这种情况下,这将是一个消除误解的好地方!

1 个答案:

答案 0 :(得分:1)

欢迎来到兔子洞。

您可能会惊喜地发现,您可以将myPackageUtilities中的函数导入myPackage1,然后将其从myPackage1导出,以使其可以从全局环境中访问。

因此,当您说myPackageUtilities中有一个函数,加载myPackage1时最终用户应该可以访问该函数,这就是我在fn_name文档中要包含的内容} myPackage1

#' @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}}

最后,我仍然认为最好的办法是从myPackageUtilities中导出myPackageUtilities之外的所有内容,并在每个需要函数的包中进行组合导入导出从myPackageUtilities可以从全球环境访问。