扩展R类的基本方法以及如何使用roxygen2进行文档



我想创建一类结果,比如things。主函数makeThings返回(实际上是一个列表(,并添加了类things(所有这些细节在下面的代码中给出(。

除了方法print(它应该是显示事物的默认方法(之外,我还想要另一个名为explain的方法,它可以打印包含更多信息的事物。

如何创建第二个方法,并确保使用roxygen标记将其发送到NAMESPACE,因为这将被放入CRAN兼容的包中。我相信S3面向对象的方法可以满足我的目的。

A MWE:

#' @title makeThings is the main function
#' 
#' @description
#' This is what this function does.
#' 
#' @export
makeThings <- function(x) {
res <- list(A=1:10, B=40:50)
class(res) <- "things"
return(res) 
}
#' @title print is the default method for things
#' 
#' @description
#' print outputs using a very basic format
#' 
#' @export
print.things <- function( something, ...) {print(something$A)}
#' @title explain is another, more verbosed, method for showing things.
#' 
#' @description
#' use explain( makeThings(43) ) to have more details.
#' 
#' @method explain things
#' @export
explain.things <- function( something, ...) {print("The meaning is ...")}

现在,按照目前的情况,printexplain作为S3method发送到NAMESPACE,但键入? explain表示explain是在泛型环境中,而不是在我的包环境中。此外,键入指令

explain(makeThings(3))

返回错误CCD_ 9。由于我尝试了许多变体,但到目前为止运气不佳,一些解释很受欢迎。

尽可能地,我希望将这三个函数放在同一个文件中。

您希望拥有一个新类的对象,并通过泛型函数的方法处理这些对象
要创建新的泛型,必须使用UseMethod,最好创建一个默认方法。

#' @title makeThings is the main function
#' 
#' @description
#' This is what this function does.
#' 
#' @export
makeThings <- function(x) {
res <- list(A = 1:10, B = 40:50)
class(res) <- "things"
return(res) 
}
#' @title explain is another, more verbosed, method for showing things.
#' 
#' @description
#' use explain( makeThings(43) ) to have more details.
#' 
#' @details
#' This is the generic function
explain <- function(x, ...) UseMethod("explain")
#' @method explain default
#' @export
explain.default <- function(x, ...) print(x)
#' @method explain things
#' @export
explain.things <- function(x, ...) {print("The meaning is ...")}
#' @examples
explain("Hello, world!")
#> [1] "Hello, world!"
explain(makeThings(3))
#> [1] "The meaning is ..."

创建于2022-07-28由reprex包(v2.0.1(


然后这些函数应该从包的命名空间导出
roxigen将在文件NAMESPACE中写入以下内容,并显示一条消息,表示不要手动编辑。

S3method(explain, things)
export(explain)
export(makeThings)

最新更新