我想创建一类结果,比如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 ...")}
现在,按照目前的情况,print
和explain
作为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)