我正在将我的一个R包分成两个,因为它包含两个逻辑上不同的功能集,其中一个比另一个更通用。但是,由于原始包装相当受欢迎,并且至少有一个其他包装,我不想破坏兼容性。
R&#39> R命名空间系统提供了一种处理方法,通过导入分离包中的函数(RNifti
),然后从下游包中重新导出它们(是RNiftyReg
)。这样,第三方用户和软件包只能加载RNiftyReg
,仍然会看到现在实际属于RNifti
的函数。此外,这些函数的文档仍然有效,因为RNifti
命名空间与RNiftyReg
一起加载。
但是,R CMD check
会抱怨,因为RNiftyReg
中没有记录重新导出的功能。
所以我的问题是:这种情况下的最佳做法是什么?
我似乎有三个选择,其中没有一个非常吸引人。
RNifti
与RNiftyReg
一起加载以使所有以前可用的功能可用来打破现有代码。显然这是不受欢迎的。RNiftyReg
中复制这些功能的所有文档。这应该让每个人都高兴,但维护起来很麻烦,如果包裹不总是一起更新,很容易失去同步。RNiftyReg
中为所有这些功能提供单一的包含所有文档的页面,指向RNifti
中的完整文档。但是仍然需要与函数参数保持同步,并且它要求用户使用笨拙的?RNifti::somefun
语法来查看" real"文档。有没有解决方法,或者像这样重新导出代码是不明智的?
答案 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。