从另一个包中导入S3通用函数

3

我正在编写一个基于ggplot2软件包中的autoplot()通用函数的软件包。目前,我有一个名为breg()的函数,它充当类breg的构造器;其输出可以使用autoplot.breg()进行绘制。在我的breg()函数内部,我的Roxygen命令如下:

#' @export breg

然后在 autoplot.breg() 中,我有以下内容:

#' @import ggplot2
#' @importFrom ggplot2 autoplot
#'
#' @method autoplot breg
#' @export

我并不确定如果我导入了整个ggplot2,是否需要@importFrom ggplot2 autoplot。然而,我偏离了主题,在我的NAMESPACE文件中,我有如下内容:

S3method(autoplot,breg)
export(breg)
import(ggplot2)
importFrom(ggplot2,autoplot)

我的问题是,为什么我仍然收到以下警告信息:
Warning message:
In setup_ns_exports(pkg, export_all) :
  Objects listed as exports, but not present in namespace: autoplot

只是想澄清一下:您是从Roxygen文档注释中生成NAMESPACE文件,对吗? - Konrad Rudolph
是的,我是。我刚刚删除了 @importFrom ggplot2 autoplot,似乎问题已经解决了。 - nathaneastwood
2
与您的问题无关,但请注意来自 Hadley 的 R packages 中的以下内容:“旧版本的 roxygen 要求所有 S3 方法都有显式的 @method generic class 标签。从 3.0.0 版本开始,这不再需要,因为 roxygen2 将自动解决它。” 据我所知,使用 @importFrom 已完全被弃用。 - Konrad Rudolph
好的,谢谢。我想最初我有一个@export autoplot,这让我认为我看到的错误意味着我需要@importFrom ggplot2 autoplot函数。关于@method generic class,我只是因为Roxygen无法识别我的一些方法,例如breg.data.frame()是一个导出的函数,但不是S3method。我目前安装的是v4.1.0版本。 - nathaneastwood
1
是的,具有非传统类名的函数(例如data.frame,其中包含一个点)可能需要显式的@export generic class声明,因为否则不清楚你指的是哪个:@export breg data.frame还是@export breg.data frame。很糟糕。 - Konrad Rudolph
是的,这很有道理。Hadley在他的书中详细讨论了这个问题,我觉得非常有趣。这就是为什么我(以及大多数人)倾向于使用下划线而不是点来命名约定的原因。 - nathaneastwood
1个回答

2

@importFrom package generic 声明如果已经有 @import package,则不需要。

检查 @export 字段是避免错误的关键!

此外,具有非常规类名(例如 data.frame)且包含点的函数可能需要显式的 @export generic class 声明,否则将不清楚你指的是哪个: @export breg data.frame 还是 @export breg.data frame


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接