导入包的S3方法而不导入其功能

时间:2020-01-08 13:56:35

标签: r r-package roxygen2 r-s3

我正在开发的程序包中具有以下依赖项链:

  • 我的软件包使用了软件包A(trajectory)中定义的类(simmer)。
  • 对于该类(plot.trajectory),它也使用S3方法,该方法在程序包B(simmer.plot)中定义。
  • 我可以整体导入程序包A,但不能整体导入程序包B,因为它包含了程序包A中定义的其他功能(get_mon函数)的替代品,因此我收到关于原始功能将被替换。

如何使用/导入S3方法而最好不通过roxygen2导入其余的程序包B?

roxygen2文档suggests the following

如果要向S3泛型添加新方法,请使用@importFrom pkg泛型导入。

在我的示例中,该名称为@importFrom simmer.plot plot,但这将返回一条警告,提示plot未导出simmer.plot。如果我首先使用@importFrom graphics plot导入通用,则会发生同样的事情。

2 个答案:

答案 0 :(得分:2)

使用(请参见this):

#' @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

答案 1 :(得分:2)

IñakiÚcar提到@rawNamespace标签使我使用this answer中提到的getNamespaceExports函数得出了一个不导入软件包B导出函数的版本:< / p>

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

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

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

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

将这些行放在NAMESPACE中:

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