我开始研究一系列 R 包,所有这些包都共享大量公共(public)代码,这些代码位于自己的包中,我们将其称为 myPackageUtilities
。所以我有几个包
myPackage1
、myPackage2
等...
所有这些包都依赖于 myPackageUtilities
中的每个方法。有关实际示例,请参阅 statnet on CRAN 。这个想法是, future 的开发人员可能会创建 myPackageN
,而不必重新编写/复制所有支持代码, future 的开发人员可以简单地使用 mypackageUtilities
来获取开始了。
有一些并发症:
1) mypackageUtilities
中的部分代码适用于最终用户,其余代码用于内部开发目的。最终用户代码需要使用 roxygen2 正确记录。此代码包括 S3 类和泛型,以及为用户提供的各种帮助函数。
2) 依赖包(myPackage1
、myPackage2
等)可能会扩展 myPackageUtilities
中定义的 S3 泛型。
我的问题是:组装所有这些的最佳方法是什么?这里有两个自然的(但非详尽的)选择:
- 在 Imports: 下为所有依赖包添加
mypackageUtilities
,并强制用户单独加载mypackageUtilities
, - 在 Depends: 下包含所有依赖包的
mypackageUtilities
,并严格选择从mypackageUtilities
导出的内容,以避免搜索路径困惑。所有内部(非导出)代码都必须通过myPackage1
等中的:::
访问。
我最初问过类似的问题over here ,但很快就发现情况很快变得复杂起来。例如:
- 如果我们使用 Imports: 而不是 Depends:,则
myPackage1
等找不到mypackageUtilities
中定义的任何泛型。- 这使得使用
mypackageUtilities
提供的通用模板变得困难/不可能,并且几乎违背了整个设置的目的。
- 这使得使用
- 如果我在
mypackageUtilities
中定义 S3 泛型并在那里记录它,我如何让 roxygen2 在myPackage1
中引用这些文档?
也许我深深误解了命名空间的工作原理,在这种情况下,这将是消除我的误解的好地方!
最佳答案
欢迎来到兔子洞。
您可能会惊喜地发现,您可以将函数从 myPackageUtilities
导入到 myPackage1
中,然后从 myPackage1
导出以使其可从全局环境访问。
因此,当您说 myPackageUtilities
中有一个函数在加载 myPackage1
时最终用户应该可以访问时,这就是我将包含在我的myPackage1
fn_name
的文档
#' @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
中的函数的包。
关于r - 开发一套依赖 R 包的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118287/