我开始研究一系列R软件包,它们共享大量的公共代码,这些代码存放在自己的软件包中,我们称之为myPackageUtilities
。所以我有几个包
myPackage1
,myPackage2
等......
所有这些包都依赖于myPackageUtilities
中的每个方法。有关实际示例,请参阅statnet on CRAN。我们的想法是,未来的开发人员可能会创建myPackageN
,而不必重新编写/复制所有支持代码,这个未来的开发人员只需使用mypackageUtilities
即可开始。
有并发症:
1) mypackageUtilities
中的一些代码适用于最终用户,其余用于内部开发目的。需要使用roxygen2正确记录最终用户代码。此代码包括S3类和泛型,以及用户的各种帮助函数。
2)依赖包(myPackage1
,myPackage2
等)可能会扩展myPackageUtilities
中定义的S3泛型。
我的问题是:汇集所有这些内容的最佳方式是什么?这里有两个自然(但非解除)的选择:
mypackageUtilities
:对于所有相关包,并强制用户单独加载mypackageUtilities
,mypackageUtilities
取决于所有依赖包,并对mypackageUtilities
导出的内容非常有选择性,以避免混乱搜索路径。所有内部(非导出)代码都必须通过:::
等中的myPackage1
进行访问。我最初问了一个类似的问题over here,但很快发现情况变得很复杂。例如:
mypackageUtilities
等找不到myPackage1
中定义的任何通用符号等。
mypackageUtilities
提供的通用模板很难/不可能,几乎无法完成整个设置的目的。mypackageUtilities
中定义S3通用并在那里记录,我怎样才能在myPackage1
中让roxygen2引用这些文档?也许我对命名空间的工作方式深感误解,在这种情况下,这将是一个消除误解的好地方!
答案 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
可以从全球环境访问。