【问题标题】:Importing a package's S3 methods without importing its functions导入包的 S3 方法而不导入其函数
【发布时间】:2020-04-26 01:59:32
【问题描述】:

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

  • 我的包使用包 A (simmer) 中定义的类 (trajectory)。
  • 它还对该类 (plot.trajectory) 使用 S3 方法,该方法在包 B (simmer.plot) 中定义。
  • 我可以将包 A 作为一个整体导入,但我不能将包 B 作为一个整体导入,因为它包含对包 A 中定义的其他函数(get_mon 函数)的替换,因此我收到有关原始函数的不需要的警告被替换。

如何使用/导入 S3 方法而不导入包 B 的其余部分,最好通过roxygen2

roxygen2 文档suggests the following

如果您想向 S3 泛型添加新方法,请使用 @importFrom pkg generic 将其导入。

对于我的示例,这将是 @importFrom simmer.plot plot,但这会返回一个警告,即 plot 不是由 simmer.plot 导出的。如果我首先使用@importFrom graphics plot 导入泛型,也会发生同样的事情。

【问题讨论】:

  • 如果您从另一个包中导入 generic 并在 your 包中添加 S3 方法,则您引用的内容。你试过#' @importFrom simmer.plot plot.trajectory吗?
  • 我有!我收到一个警告,plot.trajectory 不是由simmer.plot 导出的,即使我可以看到它在其 GitHub 存储库中:github.com/r-simmer/simmer.plot/blob/master/NAMESPACE
  • 很公平。这只是我最好的猜测,没有尝试过。我很惊讶你说它不起作用,所以我快速搜索了一下,似乎其他几个人也遇到了同样的问题,而所有任何人都没有弄清楚! stackoverflow.com/q/23112762/8386140 stackoverflow.com/q/42952244/8386140 stackoverflow.com/q/32680169/8386140 如果我没有时间研究它并且您没有得到答案,我可能会为此提供赏金。有趣的问题
  • 您是否尝试过使用 simmer.plot:::plot.trajectory() 访问该函数?
  • 这并不能解决这个特定问题,因为需要重载函数,正如我在下面的回答中所述,但您只需从包中导入单个有效函数,然后导入 S3 方法注册在那里一应俱全。见stackoverflow.com/a/59667634/6788081

标签: r r-package roxygen2 r-s3


【解决方案1】:

使用(见this):

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

【讨论】:

  • 谢谢,没想到simmer 开发者的回答!我认为重载版本只需要 plot.attributes 等,而不需要 plot.trajectory 是否正确?
  • 是的,没错。如果您只打算使用plot.trajectory,那么您的解决方案就可以了。
【解决方案2】:

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

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

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

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

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

将这些行放在 NAMESPACE 中:

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

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2018-03-28
    相关资源
    最近更新 更多