导入包的 S3 方法而不导入其函数

Importing a package's S3 methods without importing its functions

我正在开发的包中有以下依赖链:

如何在不导入包 B 的其余部分的情况下 use/import S3 方法,最好通过 roxygen2

roxygen2 文档 suggests the following:

If you want to add a new method to an S3 generic, import it with @importFrom pkg generic.

在我的示例中,这将是 @importFrom simmer.plot plot,但此 returns 警告 plot 未由 simmer.plot 导出。如果我先使用 @importFrom graphics plot.

导入泛型,也会发生同样的事情

使用(见):

#' @rawNamespace import(simmer, except=c(get_mon_arrivals, get_mon_resources, get_mon_attributes))
#' @import simmer.plot

因为您确实需要使用 simmer.plot 中的重载函数,以便那里的 plot 方法可以工作。等效但更短的版本:

#' @rawNamespace import(simmer, except=getNamespaceExports("simmer.plot"))
#' @import simmer.plot

Iñaki Úcar 提到的 @rawNamespace 标签促使我使用 this answer 中提到的 getNamespaceExports 函数制定了一个不导入包 B 的任何导出函数的版本:

#' @rawNamespace import(packageB, except = getNamespaceExports("packageB"))

roxygen2 中的 @rawNamespace 标记将原始代码插入到 NAMESPACE 文件中。 getNamespaceExports returns 命名空间中所有导出函数的名称:这可以是您尚未附加的包。

对于我的具体例子,我可以这样写:

#' @import simmer
#' @rawNamespace import(simmer.plot, except = getNamespaceExports("simmer.plot"))

将这些行放在命名空间中:

import(simmer)
import(simmer.plot, except = getNamespaceExports("simmer.plot"))