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

开发一套相关R包的最佳实践,r,dependencies,packages,roxygen2,R,Dependencies,Packages,Roxygen2,我开始研究一系列R包,所有这些包都共享大量的通用代码,这些代码都包含在自己的包中,我们称之为myPackageUtilities。所以我有几个包裹 myPackage1,myPackage2等 所有这些包都依赖于myPackageUtilities中的每个方法。有关真实世界的示例,请参见。这个想法是未来的开发人员可以创建myPackageN,而不必重新编写/复制所有支持代码,这个未来的开发人员只需使用mypackageUtilities就可以开始了 有一些复杂的情况: 1) mypackageU

我开始研究一系列R包,所有这些包都共享大量的通用代码,这些代码都包含在自己的包中,我们称之为
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
        提供的通用模板变得困难/不可能,并且几乎破坏了整个设置的目的
    • 如果我在
      mypackageUtilities
      中定义了一个S3泛型,并将其记录在那里,我如何让roxygen2在
      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
    中的函数可以从全局环境访问