如何解决检查期间未找到导出的S3方法
编辑:下面的所有内容都经过了严格的编辑,因为正如@ user2554330和@MrFlick指出的那样,由于我最初提供的伪代码无法重现我的问题,所以。
我有一个函数foo()
,该函数创建类foo
的对象。它与plot()
泛型方法一起记录。
#' Create a foo object
#'
#' @param x A numeric vector.
#'
#' @return
#' A foo object.
#'
#' @examples
#' foo_object <- foo(1:10)
#' plot.foo(foo_object)
#'
#' @export
foo <- function(x) {
structure(x,class = c("foo","numeric"))
}
#' Methods for class foo
#'
#' @param x A foo object.
#' @param ... Unused optional arguments.
#'
#' @name foo-methods
NULL
#' @rdname foo-methods
#' @export
#' @importFrom graphics plot
plot.foo <- function(x,...) {
class(x) <- setdiff(class(x),"foo")
plot(x)
invisible(NULL)
}
该示例在加载了包的R会话中运行没有问题,但是devtools::check()
仍然抱怨:
Error in plot.foo(foo_out) : could not find function "plot.foo"
Execution halted
似乎知道plot.foo()
存在,但不知道其定义。发生了什么事?
编辑:将devtools::check()
中的plot.foo(foo_object)
替换为@examples
后,plot(foo_object)
运行没有错误。一切都很好,因为用户无论如何都应该调用泛型,但是问题仍然存在:鉴于该方法已导出并且S3method(plot,foo)
出现在NAMESPACE
中,为什么找不到该方法?>
解决方法
如果您希望能够直接调用plot.foo
,则还需要显式导出该版本。按照惯例,通常不会从包中导出通用函数的类的特定实现。通常,您只需要声明S3方法存在而使函数不导出即可。就像您打电话给methods(plot)
一样,您会看到一堆带有星号的星号,这意味着它们是意外的,不能直接调用。如果出于某种原因想要将其导出为单独的函数,则可以添加其他导出语句。例如
#' @rdname foo-methods
#' @export plot.foo
#' @export
#' @importFrom graphics plot
plot.foo <- function(x,...) {
class(x) <- setdiff(class(x),"foo")
plot(x)
invisible(NULL)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。