如何使用Roxygen从不同的包中正确地logging一个通用的S3方法?

我正在编写一个包,它定义了一个新的类,测量员和print方法,即print.surveyor 。 我的代码工作正常,我使用roxygen内联文档。 但R CMD check发出警告:

在文档对象“print.surveyor”中使用的函数/方法,但不在代码中:print

我使用Hadley编写的以下两页作为灵感: 名称空间和文档函数 ,它们都声明正确的语法是@method function-name class

所以我的问题是:使用Roxygenlogging我的新类的print方法的正确方法是什么? 更具体地说,我该如何摆脱这个警告?


这里是我的代码:(注释文件指出了解决这个问题的尝试,但都没有成功。)

 #' Prints surveyor object. #' #' Prints surveyor object #' ## #' @usage print(x, ...) ## #' @aliases print print.surveyor #' @param x surveyor object #' @param ... ignored #' @S3method print surveyor print.surveyor <- function(x, ...){ cat("Surveyor\n\n") print.listof(x) } 

roxygenized输出,即print.surveyor.Rd

 \name{print.surveyor} \title{Prints surveyor object.} \usage{print(x, ...) #'} \description{Prints surveyor object.} \details{Prints surveyor object #'} \alias{print} \alias{print.surveyor} \arguments{\item{x}{surveyor object} \item{...}{ignored}} 

由于roxygen2> 3.0.0。,你只需要@export因为roxygen可以计算出print.surveyor是一个S3方法。 这意味着你现在只需要

 #' Prints surveyor object. #' #' @param x surveyor object #' @param ... ignored #' @export print.surveyor <- function(x, ...){ cat("Surveyor\n\n") print.listof(x) } 

但是,在这种情况下,由于文档并不是非常有用,所以最好这样做:

 #' @export print.surveyor <- function(x, ...){ cat("Surveyor\n\n") print.listof(x) } 

更新

从roxygen2> 3.0.0开始,这个软件包已经变得更加聪明了。 你现在只需要@export标签, roxygen会在转换过程中编写NAMESPACE等时计算出你正在logging什么types的东西,并做适当的事情。

有一些例外,你可能需要帮助roxygen 。 Hadley Wickham在R Packages中使用的例子是all.equal.data.frame 。 这个函数的名字是什么类的,什么是generics函数( allall.equalall.equal.data )是不all.equal.data

在这种情况下,你可以通过明确地通知generics和类/方法来帮助淘汰,例如

 @method all.equal data.frame 

如果您需要明确使用@method下面的原始答案将解释更多关于旧的行为。


原版的

这个函数应该用@method标签logging@method

 #' @method print surveyor 

在初读时,@ hadley的文档对我来说有些困惑,因为我对roxygen并不熟悉,但经过几节的阅读,我想我明白了你为什么需要@method的原因。

您正在编写print方法的完整文档。 @S3methodNAMESPACE相关,并安排输出方法@S3method不是用来logging一个方法的。

你的Rd文件应该在usage部分有以下内容:

 \method{print}{surveyor}(x, ...) 

如果这个工作正常,那是在Rd文件中loggingS3方法的正确方法。