如何使用Roxygen2正确记录S4类插槽?


306

对于使用roxygen(2)记录类,指定标题和描述/详细信息似乎与函数,方法,数据等相同。但是,插槽和继承是它们自己的动物。在roxygen2中记录S4类的最佳实践(当前或计划中的)是什么?

尽职调查:

@slot在早期的氧气描述中发现了一个标签。 2008 R-forge邮件列表中的帖子 似乎表明这已经死了,并且不支持@slotroxygen:

roxygen2是真的吗?前面提到的帖子建议用户改用LaTeX标记创建自己的逐项列表。例如,扩展"character"该类的新S4类将像这样进行编码和记录:

#' The title for my S4 class that extends \code{"character"} class.
#'
#' Some details about this class and my plans for it in the body.
#'
#' \describe{
#'    \item{myslot1}{A logical keeping track of something.}
#'
#'    \item{myslot2}{An integer specifying something else.}
#' 
#'    \item{myslot3}{A data.frame holding some data.}
#'  }
#' @name mynewclass-class
#' @rdname mynewclass-class
#' @exportClass mynewclass
setClass("mynewclass",
    representation(myslot1="logical",
        myslot2="integer",
        myslot3="data.frame"),
    contains = "character"
)

然而,尽管这个作品,这\describe\item用于记录的插槽做法似乎与roxygen(2)其余不一致,在没有@-delimited标签和插槽也没有从反对去无证roxygenize()。它也没有说明以一致的方式来记录所定义类的继承的方法。我认为使用该@import标签,依存关系通常仍然可以正常工作(如果特定插槽需要另一个程序包的非基类)。

因此,总而言之,roxygen(2)插槽当前的最佳实践是什么?

目前似乎要考虑三个选项:

  • A-逐项列出(例如上面的示例)。
  • B @slot-...但是我错过了额外的标签/实现。在上面的示例中,我无法使用@slot来与roxygen / roxygen2配合使用,该版本将其替换为逐项列出的列表。同样,以上示例确实适用于roxygen(2)。
  • C-一些用于指定插槽的替代标签,例如@param,可以完成相同的操作。

我是从我roxygen2github上的开发页面上发布的帖子中借用/扩展了这个问题。


16
@slot这可能是您长期想要的,但必须首先实施...
hadley 2011年

3
谢谢!很高兴知道。我很高兴我的代码中的setClass语句少于setMethod。一旦@slot实施更改,就不会太痛苦。
Paul McMurdie 2011年



2
现在,Roxygen2版本3(可在github上)完全支持S4类。
格里戈尔·托马斯

Answers:


29

更新了Roxygen2 5.0.1的答案,当前版本为6.0.1

对于S4,现在的最佳做法是使用@slot标签进行记录:

#' The title for my S4 class that extends \code{"character"} class.
#'
#' Some details about this class and my plans for it in the body.
#'
#' @slot myslot1 A logical keeping track of something.
#' @slot myslot2 An integer specifying something else.
#' @slot myslot3 A data.frame holding some data.
#'
#' @name mynewclass-class
#' @rdname mynewclass-class
#' @export

附带说明,@exportClass仅在某些情况下才有必要,@export现在正在使用导出函数的一般方法。您也不必导出类,除非您希望其他包能够扩展该类。

另请参见http://r-pkgs.had.co.nz/namespace.html#exports

更新了Roygen2 3.0.0的答案,当前版本为5.0.1。

对于S4,最佳实践是采用以下格式的文档:

#'  \section{Slots}{
#'    \describe{
#'      \item{\code{a}:}{Object of class \code{"numeric"}.}
#'      \item{\code{b}:}{Object of class \code{"character"}.}
#'    }
#'  }

这与插槽内部表示为对象内部列表的方式一致。如您所指出的,此语法不同于其他语法,我们可能希望将来有一个更强大的解决方案,其中包含继承知识-但今天不存在。

正如@Brian Diggs指出的那样,此功能已纳入3.0.0,请在https://github.com/klutometis/roxygen/pull/85进行进一步讨论


2
您是否使用过@Brian Diggs的实现?它行得通吗?您是否认为可以提供有关该方法的一些细节(因此类似于@slot解决方案)。我还没有尝试一下,可能(很懒惰)等待这个未决的@slot解决方案。我知道这不是问题的方式,但是根据评论(包括@hadley的评论),这似乎@slot是“真实”的答案。我同意您的评估,逐项列出清单(如我的问题)是当前的最佳做法,尽管希望很快就会被取代。
Paul McMurdie 2012年

19

如果您要在Rd文件本身中记录插槽,Full Decent提供的解决方案就可以了。使用时roxygen2,您可以使用标记@section与进行基本相同的操作\describe。一个例子:

#' The EXAMPLE class
#'
#' This class contains an example. This line goes into the description
#'
#' This line and the next ones go into the details.
#' This line thus appears in the details as well.
#'
#'@section Slots: 
#'  \describe{
#'    \item{\code{slot1}:}{Matrix of class \code{"numeric"}, containing data from slot1}
#'    \item{\code{slot2}:}{Object of class \code{"character"}, containing data that needs to go in slot2.}
#'  }
#'
#' @note You can still add notes
#' @name EXAMPLE 
#' @rdname EXAMPLE
#' @aliases EXAMPLE-class
#' @exportClass EXAMPLE
#' @author Joris Meys

14

roxygen2 v4.1 +和Hadley的最新文档可以做到这一点:

http://r-pkgs.had.co.nz/man.html#man-classes

我还没有为RC尝试过它,但现在对S4来说对我有效。

先前

Roxygen2版本3.0+似乎完全支持S4类插槽:

http://blog.rstudio.org/2013/12/09/roxygen2-3-0-0/

“使用roxygen2记录您的S4类,S4方法和RC类–您可以安全地删除使用@alias和的变通方法@usage,而仅依靠roxygen2来做正确的事情。”


2
@slot可以完美工作,您也可以使用它(或@field)来伪造S3类的文档。
布兰登·贝特尔森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.