Roxygen2 - 如何正确记录S3方法

SFu*_*n28 45 r roxygen roxygen2

我已经阅读了Roxygen2 PDF以及这个网站,我对@method @ S3method @export和你如何使用它们来正确记录S3方法之间的区别感到迷茫.我

编写了以下示例进行讨论:1.我如何正确记录这些内容?

2.我如何模拟?print和其他通用函数的文档,这些函数显示所有特定于类的实现的用例(即方式?print显示'factor','table','function'的用法)

3.来自wiki页面:"所有导出的方法都需要@ S3method标记.它的格式与@method相同.这会导出方法,而不是函数 - 即泛型(myobject)将起作用,但generic.mymethod(myobject)不会."
我无法解释这一点.这似乎说如果标签指定不正确,函数/方法调用将无法正常工作?具体会打破什么?

MyHappyFunction = function( x , ... )
{
    UseMethod( "MyHappyFunction" )
}

MyHappyFunction.lm = function( x , ... )
{
  # do some magic
}
Run Code Online (Sandbox Code Playgroud)

had*_*ley 58

从roxygen2> 3.0.0开始,您只需要@export:

#' A description of MyHappyFunction
#'
#' A details of MyHappyFunction
#'
#' @title MyHappyFunction: The my happy function
#' @param x numeric number
#' @param ... other arguments
#' @examples
#' a <- 1
#' class(a) <- "lm"
#' MyHappyFunction(a)
#' @export
MyHappyFunction <- function(x, ...){
  UseMethod("MyHappyFunction")
}

#' @rdname MyHappyFunction
#' @export
MyHappyFunction.lm = function(x, ...) {
  # do some magic
}

#' @rdname MyHappyFunction
#' @export
MyHappyFunction.default = function(x, ...) {
  # do some magic
}
Run Code Online (Sandbox Code Playgroud)

但由于您实际上没有记录方法,因此以下内容就足够了:

#' A description of MyHappyFunction
#'
#' A details of MyHappyFunction
#'
#' @title MyHappyFunction: The my happy function
#' @param x numeric number
#' @param ... other arguments
#' @examples
#' a <- 1
#' class(a) <- "lm"
#' MyHappyFunction(a)
#' @export
MyHappyFunction <- function(x, ...){
  UseMethod("MyHappyFunction")
}

#' @export
MyHappyFunction.lm = function(x, ...) {
  # do some magic
}

#' @export
MyHappyFunction.default = function(x, ...) {
  # do some magic
}
Run Code Online (Sandbox Code Playgroud)

  • 哼.在最新的r-devel中有没有机会被打破?我正在使用roxygen2 4.1.1和开发R(转68657)并且有一个看起来像这样的例子(据我所见),其中S3方法未被正确识别... (6认同)
  • @BenBolker我也是,在命名空间packageVersion("roxygen2")#[1]'4.1.1'中导出S3而不是S3'd (5认同)
  • 这个例子非常简单明了,可能属于这里:http://adv-r.had.co.nz/OO-essentials.html#s3 (3认同)
  • 我遇到了与 BenBolker 和 tim 相同的问题,并在这里找到了解决方案 /sf/answers/2074778611/ (2认同)

Tri*_*ou. 37

@method标签生成的Rd文件的\使用领域\方法条目.

@S3method标签命名空间中的文件生成S3method()项.

@export标签生成导出()命名空间中的文件条目.

这是我的例子:

#' A description of MyHappyFunction
#'
#' A details of MyHappyFunction
#'
#' @title MyHappyFunction: The my happy function
#' @param x numeric number
#' @param ... other arguments
#' @examples
#' a <- 1
#' class(a) <- "lm"
#' MyHappyFunction(a)
#'
#' @rdname MyHappyFunction
#' @export MyHappyFunction
MyHappyFunction <- function(x, ...){
  UseMethod("MyHappyFunction")
}

#' @return \code{NULL}
#'
#' @rdname MyHappyFunction
#' @method MyHappyFunction lm
#' @S3method MyHappyFunction lm
MyHappyFunction.lm = function(x, ...) {
  # do some magic
}

#' @return \code{NULL}
#'
#' @rdname MyHappyFunction
#' @method MyHappyFunction default
#' @S3method MyHappyFunction default
MyHappyFunction.default = function(x, ...) {
  # do some magic
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

3来自维基页面...

我想这意味着"你不写作@S3method generic mymethod myobject."

  • 正确.但是`@ method` +`@export`相当于`@s3method` (5认同)
  • 对于多年以后仍在这里访问的任何人,从Roxygen2 6.0.1开始,不建议使用@ S3method并提供警告:脚本R:302:不建议使用@ S3method。请改用@ export`。`@ method` +`@ export`可以解决问题。不过,`R CMD check`仍然抱怨只使用`@ export`。 (3认同)
  • 当我在roxygen(0.1-2)和roxygen2(2.1)中测试时,`@ method` +`@export`并不等同于`@S3method`,正如SFun28所说.`@ S3method`没有生成\ method条目.我认为roxygen(0.1-2)和roxygen2(2.1)都需要这两个标签. (2认同)