Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R包中记录重新导出的函数_R_Namespaces_Documentation - Fatal编程技术网

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

在R包中记录重新导出的函数,r,namespaces,documentation,R,Namespaces,Documentation,我正在将我的一个R包拆分为两个,因为它包含两个逻辑上不同的功能集,其中一个比另一个更通用。然而,由于最初的包相当流行,并且至少依赖于另一个包,所以我不想破坏兼容性 R的命名空间系统提供了一种处理这种情况的方法,方法是导入拆分包(即)中的函数,然后从下游包(即)重新导出它们。这样,第三方用户和软件包可以只加载RNiftyReg,仍然可以看到现在实际属于RNifti的函数。此外,这些函数的文档仍然有效,因为RNifti名称空间与RNiftyReg一起加载 但是,R CMD check会抱怨,因为重新

我正在将我的一个R包拆分为两个,因为它包含两个逻辑上不同的功能集,其中一个比另一个更通用。然而,由于最初的包相当流行,并且至少依赖于另一个包,所以我不想破坏兼容性

R的命名空间系统提供了一种处理这种情况的方法,方法是导入拆分包(即)中的函数,然后从下游包(即)重新导出它们。这样,第三方用户和软件包可以只加载
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
和/或import
RNifti
才能实现这一点,我不想把这一要求强加给第三方感谢您指出这一点。我不知道docType导入。看起来您现在还需要包含
#@importFrom
以获得
roxygen
以正确记录它。见例。