开发一套相关R包的最佳实践
我开始研究一系列R包,所有这些包都共享大量的通用代码,这些代码都包含在自己的包中,我们称之为开发一套相关R包的最佳实践,r,dependencies,packages,roxygen2,R,Dependencies,Packages,Roxygen2,我开始研究一系列R包,所有这些包都共享大量的通用代码,这些代码都包含在自己的包中,我们称之为myPackageUtilities。所以我有几个包裹 myPackage1,myPackage2等 所有这些包都依赖于myPackageUtilities中的每个方法。有关真实世界的示例,请参见。这个想法是未来的开发人员可以创建myPackageN,而不必重新编写/复制所有支持代码,这个未来的开发人员只需使用mypackageUtilities就可以开始了 有一些复杂的情况: 1) mypackageU
myPackageUtilities
。所以我有几个包裹
myPackage1
,myPackage2
等
所有这些包都依赖于myPackageUtilities
中的每个方法。有关真实世界的示例,请参见。这个想法是未来的开发人员可以创建myPackageN
,而不必重新编写/复制所有支持代码,这个未来的开发人员只需使用mypackageUtilities
就可以开始了
有一些复杂的情况:
1) mypackageUtilities
中的一些代码是供最终用户使用的,其余的用于内部开发。最终用户代码需要使用roxygen2正确记录。这段代码包括S3类和泛型,以及用户的各种帮助函数
2) 依赖包(myPackage1
,myPackage2
等)可能会扩展myPackageUtilities
中定义的S3泛型
我的问题是:组装所有这些组件的最佳方式是什么?以下是两个自然(但非劝诫性)选项:
mypackageUtilities
,并强制用户单独加载mypackageUtilities
mypackageUtilities
包含在dependens:下,用于所有依赖包,并对从mypackageUtilities
导出的内容进行严格选择,以避免搜索路径混乱。所有内部(非导出)代码必须通过myPackage1
中的:
访问- 如果我们使用Imports:而不是Depends:,那么
中定义的任何泛型都不会被mypackageUtilities
等找到。myPackage1
- 这使得使用
提供的通用模板变得困难/不可能,并且几乎破坏了整个设置的目的mypackageUtilities
- 这使得使用
- 如果我在
中定义了一个S3泛型,并将其记录在那里,我如何让roxygen2在mypackageUtilities
中引用这些文档myPackage1
也许我对名称空间的工作原理有着深刻的误解,在这种情况下,这将是一个消除误解的好地方 欢迎来到兔子洞 您可能会惊喜地发现,您可以将函数从
myPackageUtilities
导入到myPackage1
中,然后从myPackage1
导出,以便从全局环境访问它
因此,当您说您在myPackageUtilities
中有一个函数,当加载myPackage1
时,最终用户应该可以访问该函数,这就是我在myPackage1
中的fn\u name
文档中要包含的内容
#' @importFrom myPackageUtilities fn_name
#' @export fn_name
(参见示例)
这仍然留下了如何链接到原始文档的问题。恐怕我没有一个好的答案。我目前的做法基本上是从原始源代码复制参数文档,然后在我的@details
部分写入请参阅\code{\link[myPackageUtilities]{fn_name}}
最后,我仍然认为您最好的选择是从myPackageUtilities
导出所有在myPackageUtilities
之外使用的东西,并在每个包中进行组合导入导出,其中您希望从myPackageUtilities
中的函数可以从全局环境访问