我在正在开发的软件包中有以下依赖链:
- 我的软件包使用软件包 A (
simmer
( 中定义的类 (trajectory
(。 - 它还对该类(
plot.trajectory
(使用S3方法,该方法在包B(simmer.plot
(中定义。
我可以将包 A 作为一个整体导入, - 但我不能将包 B 作为一个整体导入,因为它包含包 A 中定义的其他函数(
get_mon
函数(的替换,因此我收到有关原始函数被替换的不需要的警告。
如何在不导入包 B 的其余部分的情况下使用/导入 S3 方法,最好是通过roxygen2
?
roxygen2
文档建议如下:
如果要向 S3 泛型添加新方法,请使用 @importFrom pkg 泛型导入该方法。
对于我的示例,这将是@importFrom simmer.plot plot
,但这会返回一条警告,指出plot
不是由simmer.plot
导出的。如果我先使用@importFrom graphics plot
导入泛型,也会发生同样的事情。
Iñaki Úcar 提到@rawNamespace
标签,这让我想到了一个不导入包 B 的任何导出函数的版本,使用本回答中提到的getNamespaceExports
函数:
#' @rawNamespace import(packageB, except = getNamespaceExports("packageB"))
roxygen2
中的@rawNamespace
标记将原始代码插入到 NAMESPACE 文件中。getNamespaceExports
返回命名空间中所有导出函数的名称:这可以是尚未附加的包。
对于我的具体示例,我可以这样写:
#' @import simmer
#' @rawNamespace import(simmer.plot, except = getNamespaceExports("simmer.plot"))
将以下行放在命名空间中:
import(simmer)
import(simmer.plot, except = getNamespaceExports("simmer.plot"))
使用(见这里(:
#' @rawNamespace import(simmer, except=c(get_mon_arrivals, get_mon_resources, get_mon_attributes))
#' @import simmer.plot
因为你真的需要使用simmer.plot
中的重载函数,以便那里的绘图方法可以工作。等效但更短的版本:
#' @rawNamespace import(simmer, except=getNamespaceExports("simmer.plot"))
#' @import simmer.plot