【问题标题】:Documenting re-exported functions in an R package在 R 包中记录重新导出的函数
【发布时间】:2016-09-21 14:43:40
【问题描述】:

我正在将我的一个 R 包分成两个,因为它包含两组逻辑上不同的功能,其中一个比另一个更通用。但是,由于原始包相当受欢迎,并且至少依赖于另一个包,因此我不想破坏兼容性。

R 的命名空间系统提供了一种处理此问题的方法,方法是导入拆分包(RNifti)中的函数,然后从下游包(RNiftyReg)重新导出它们。这样,第三方用户和包可以只加载RNiftyReg,并且仍然可以看到现在实际上属于RNifti 的功能。此外,这些函数的文档仍然有效,因为 RNifti 命名空间与 RNiftyReg 一起加载。

但是,R CMD check 抱怨,因为重新导出的函数没有记录在 RNiftyReg 中。

所以我的问题是:这种情况下的最佳做法是什么?

我似乎有三个选择,没有一个很吸引人。

  • 打破现有代码,要求将新包RNiftiRNiftyReg 一起加载,以使所有以前可用的功能都可用。显然这是不可取的。
  • 复制下游软件包RNiftyReg 中这些函数的所有文档。这应该让每个人都满意,但维护起来很麻烦,而且如果包不总是一起更新,很容易不同步。
  • RNiftyReg 中为所有这些功能提供一个包罗万象的文档页面,指向RNifti 中的完整文档。但这仍然需要在函数参数方面保持同步,并且它要求用户使用笨拙的 ?RNifti::somefun 语法来查看“真实”文档。

有没有办法解决这个问题,或者像这样重新导出代码是不明智的?

【问题讨论】:

    标签: r namespaces documentation


    【解决方案1】:

    进一步研究发现,R 版本 3.1.1 中添加的 \docType{import} 似乎是处理这种情况的最佳可用机制(如 this roxygen2 issue 中所述)。这似乎与我上面的第三个选项一样有效,但它的优点是不显式记录函数参数,因此它们不必保持同步。

    看来roxygen2的语法很像

    #' @export
    RNifti::xform
    

    生成正确格式的 .Rd 文件,并满足R CMD check。我以前没有使用过这种特殊的语法,这就是问题仍然悬而未决的原因。

    我已经确认这适用于未经修改的第三方软件包,因此看起来是最好的选择。

    【讨论】:

    【解决方案2】:

    我不会导入所有这些函数只是为了再次导出它们。对于这类事情,最合乎逻辑的做法似乎是让包 RNiftyReg 依赖于包 RNifti。

    所以你添加到DESCRIPTION文件中的依赖字段:

    Depends:
        RNifti
    

    要 100% 确保您使用 RNiftyReg 中的正确函数,您可以在代码中使用 :: 运算符调用它们,例如:

    RNifti::aNiceFunction(arg1, arg2)
    

    您可以将 RNifti 添加到 Depends 字段并仍然通过 NAMESPACE 文件导入包。如果您想保持 RNifti 的功能可用于仅导入 RNiftyReg 命名空间的包,这是必要的。

    在这种情况下,您不会在说明文件的 Imports: 字段中提及它。正如手册所说,一个包应该只在两者之一中提及。由于您希望附加 RNifti 的命名空间,因此您必须在 Depends 字段中提及它。

    所以这实际上是您的第一个选项,但这样做的方式是用户几乎不会注意到这种情况发生。 library('RNiftyReg') 现在也会自动附加 RNifti。

    【讨论】:

    • 是的,这是一个非常明智的解决方案。我想我已经逐渐习惯于使用Imports 而不是Depends,所以现在我倾向于忘记后者仍然存在...... :)
    • 如果只是一两个函数,我会尽量减少RNiftyReg 中函数的文档页面,并使用几个明确的语句来查看\code{\link[RNifti]{fn_name}}。但是,如果您真的依赖 RNifti 来使 RNiftyReg 发挥作用,那么 Joris Meys 给出了明智的建议。
    • 实际上,这不是一个完整的解决方案,因为虽然它适用于调用library(RNiftyReg) 的用户会话,但它不适用于只导入RNiftyReg 的第三方包。在一个这样的包上运行R CMD check 仍然报告“丢失或未导出的对象”。
    • @JonClayden 你试过了吗?如果在 Depends 字段中添加了 RNifti,则 R CMD 检查将在运行检查 afaik 之前附加该检查。此外,使用完整的RNifti::myfun() 表示法将确保找到所有函数。恕我直言,如果您依赖 RNifti 在第三个包中未导出的功能,这种行为只会发生,但如果您问我,这是一个设计禁忌。如上所述,您可以在 RNiftyReg 命名空间中导入 RNifti。只要 Depends 下有 RNifti,就不需要导出 RNifti 函数。
    • 是的,我试过了。第三个包导入RNiftyReg,因此它加载其命名空间但不附加包。由于RNiftyReg 没有附加,RNifti 也没有附加,因此RNifti 中的功能不可用。第三个包必须依赖RNiftyReg 和/或导入RNifti 才能完成这项工作,我不想把这个要求强加给第三方
    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 2020-10-01
    • 2014-09-06
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多