在R包中记录重新导出的函数
我正在将我的一个R包拆分为两个,因为它包含两个逻辑上不同的功能集,其中一个比另一个更通用。然而,由于最初的包相当流行,并且至少依赖于另一个包,所以我不想破坏兼容性 R的命名空间系统提供了一种处理这种情况的方法,方法是导入拆分包(即)中的函数,然后从下游包(即)重新导出它们。这样,第三方用户和软件包可以只加载在R包中记录重新导出的函数,r,namespaces,documentation,R,Namespaces,Documentation,我正在将我的一个R包拆分为两个,因为它包含两个逻辑上不同的功能集,其中一个比另一个更通用。然而,由于最初的包相当流行,并且至少依赖于另一个包,所以我不想破坏兼容性 R的命名空间系统提供了一种处理这种情况的方法,方法是导入拆分包(即)中的函数,然后从下游包(即)重新导出它们。这样,第三方用户和软件包可以只加载RNiftyReg,仍然可以看到现在实际属于RNifti的函数。此外,这些函数的文档仍然有效,因为RNifti名称空间与RNiftyReg一起加载 但是,R CMD check会抱怨,因为重新
RNiftyReg
,仍然可以看到现在实际属于RNifti
的函数。此外,这些函数的文档仍然有效,因为RNifti
名称空间与RNiftyReg
一起加载
但是,R CMD check
会抱怨,因为重新导出的函数没有记录在RNiftyReg
中
所以我的问题是:在这种情况下,什么是最佳实践?
我似乎有三个选择,没有一个很吸引人
- 通过要求将新软件包
与RNifti
一起加载,以使所有以前可用的功能都可用,从而中断现有代码。显然,这是不可取的RNiftyReg
- 复制下游包中这些函数的所有文档,
。这应该让每个人都感到高兴,但维护起来很麻烦,如果包不总是一起更新,那么很容易失去同步RNiftyReg
- 为
中的所有这些功能提供一个单一的全面文档页面,指向RNiftyReg
中的完整文档。但这仍然需要与函数参数保持同步,并且需要用户使用笨拙的RNifti
语法来查看“真正的”文档?RNifti::somefun
有没有办法解决这个问题,或者像这样重新导出代码是不明智的?我不会导入所有这些函数,只是为了再次导出它们。对于这类事情,最合乎逻辑的做法似乎是使包RNiftyReg依赖于包RNifti 因此,您将添加到描述文件中的Depends字段:
Depends:
RNifti
为了100%确保使用RNiftyReg中的正确函数,可以使用代码中的:
运算符调用它们,例如:
RNifti::aNiceFunction(arg1, arg2)
您可以将RNifti添加到Depends字段,并且仍然可以通过名称空间文件导入包。如果要使RNifti
的函数对仅导入RNiftyReg
命名空间的包可用,则必须执行此操作
在这种情况下,您不会在描述文件的Imports:字段中提到它。正如手册所说,一个包应该只在两者中的一个中提及。当您希望附加RNifti的名称空间时,必须在Depends字段中提及它
所以这实际上是你的第一个选择,但这样做的方式,用户几乎不会注意到这种情况发生<代码>库('RNiftyReg')现在也将自动附加RNifti。进一步研究,看起来在R版本3.1.1中添加的
\docType{import}
是处理此场景的最佳可用机制(如中所述)。这似乎与上面我的第三个选项类似,但它的优点是不显式地记录函数参数,因此它们不必保持同步
似乎roxygen2
语法类似
#' @export
RNifti::xform
生成正确格式的.Rd文件,并满足R CMD check
。我以前没有使用这种特殊的语法,这就是为什么这个问题仍然悬而未决的原因
我已经确认,这适用于未经修改的第三方软件包,因此它看起来是最好的选择。是的,这是一个完全合理的解决方案。我想我已经逐渐习惯于使用
导入
而不是依赖
,所以现在我倾向于忘记后者仍然存在……)如果只是一个或两个函数,我会尽可能减少RNiftyReg
中函数的文档页面,并使用几个express语句查看\code{\link[RNifti]{fn_name}
。但是如果你真的依赖RNiftyReg
来运行RNiftyReg
,那么Joris Meys已经给出了明智的建议。实际上,这不是一个完整的解决方案,因为它适用于调用library(RNiftyReg)
的用户会话,但不适用于只导入RNiftyReg
的第三方软件包。在一个这样的包上运行R CMD check
,仍然会报告“丢失或未报告的对象”。@JonClayden您尝试过吗?如果在Depends字段中添加了RNifti,R CMD check将在运行afaik检查之前附加该字段。此外,使用完整的RNifti::myfun()
符号将确保找到所有函数。这种行为只有在依赖第三个软件包中RNifti未导出的函数时才会发生,但如果你问我,这是一个设计“否”。如上所述,您可以在RNiftyReg名称空间中导入RNifti。不需要导出RNifti函数,只要你有RNifti在依赖项下。是的,我试过了。第三个包导入RNiftyReg
,因此它加载其名称空间,但不附加包。由于未附加RNiftyReg
,因此RNifti
中的功能不可用。第三个包必须依赖于RNiftyReg
和/或importRNifti
才能实现这一点,我不想把这一要求强加给第三方感谢您指出这一点。我不知道docType导入。看起来您现在还需要包含#@importFrom
以获得roxygen
以正确记录它。见例。