在R包中记录重新导出的函数

时间:2016-09-21 14:43:40

标签: r namespaces documentation

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

R&#39> R命名空间系统提供了一种处理方法,通过导入分离包中的函数(RNifti),然后从下游包中重新导出它们(是RNiftyReg)。这样,第三方用户和软件包只能加载RNiftyReg,仍然会看到现在实际属于RNifti的函数。此外,这些函数的文档仍然有效,因为RNifti命名空间与RNiftyReg一起加载。

但是,R CMD check会抱怨,因为RNiftyReg中没有记录重新导出的功能。

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

我似乎有三个选择,其中没有一个非常吸引人。

  • 通过要求将新包RNiftiRNiftyReg一起加载以使所有以前可用的功能可用来打破现有代码。显然这是不受欢迎的。
  • 在下游包RNiftyReg中复制这些功能的所有文档。这应该让每个人都高兴,但维护起来很麻烦,如果包裹不总是一起更新,很容易失去同步。
  • RNiftyReg中为所有这些功能提供单一的包含所有文档的页面,指向RNifti中的完整文档。但是仍然需要与函数参数保持同步,并且它要求用户使用笨拙的?RNifti::somefun语法来查看" real"文档。

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

2 个答案:

答案 0 :(得分:4)

从进一步的讨论中,看起来像{3.1}中添加的\docType{import}是处理这种情况的最佳可用机制(如this roxygen2 issue中所述)。这似乎有效地表现得像我上面的第三个选项,但它的优点是不能明确记录函数参数,因此它们不必保持同步。

似乎roxygen2语法如

#' @export
RNifti::xform

生成正确形式的.Rd文件,并满足R CMD check。我以前没有使用过这种特殊的语法,这就是为什么这个问题仍然很突出。

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

答案 1 :(得分:2)

我不会导入所有这些功能只是为了再次导出它们。对于这些事情,最常做的事情似乎是使RNiftyReg包依赖于包RNifti。

因此,您将添加到DESCRIPTION文件中的Depends字段:

Depends:
    RNifti

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

RNifti::aNiceFunction(arg1, arg2)

您可以将RNifti添加到Depends字段,并仍然通过NAMESPACE文件导入包。如果您希望将RNifti的函数保留为仅导入RNiftyReg命名空间的包,则必须执行此操作。

在这种情况下,您不会在DESCRIPTION文件的Imports:字段中提及它。正如手册所说,只应在其中一个中提及包装。正如您想要附加RNifti的命名空间一样,您必须在Depends字段中提及它。

所以这实际上是你的第一选择,但是用户几乎没有注意到这种情况。 library('RNiftyReg')现在也会自动附加RNifti。