如何使用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函数( all
, all.equal
或all.equal.data
)是不all.equal.data
?
在这种情况下,你可以通过明确地通知generics和类/方法来帮助淘汰,例如
@method all.equal data.frame
如果您需要明确使用@method
下面的原始答案将解释更多关于旧的行为。
原版的
这个函数应该用@method
标签logging@method
:
#' @method print surveyor
在初读时,@ hadley的文档对我来说有些困惑,因为我对roxygen并不熟悉,但经过几节的阅读,我想我明白了你为什么需要@method
的原因。
您正在编写print
方法的完整文档。 @S3method
与NAMESPACE
相关,并安排输出方法 。 @S3method
不是用来logging一个方法的。
你的Rd文件应该在usage
部分有以下内容:
\method{print}{surveyor}(x, ...)
如果这个工作正常,那是在Rd文件中loggingS3方法的正确方法。