【问题标题】:Is it possible to dispatch S3 methods based on the class of an argument specified by its position only?是否可以仅根据其位置指定的参数类来调度 S3 方法?
【发布时间】:2019-05-18 18:33:35
【问题描述】:

假设我们有以下 S3 泛型,我们想要使用第一个参数的类进行调度:

genfun <- function(x, ...) UseMethod("genfun", x)

现在让我们考虑这个泛型的numeric 方法:

genfun.numeric <- function(x, y) {
  x[y]
}

以下调用运行良好:

genfun(1:5, 3)

值得注意的是,方法的参数名称似乎不需要与泛型的名称匹配。事实上,如果我们这样定义numeric 方法:

genfun.numeric <- function(a, b) {
  a[b]
}

它也有效:

genfun(1:5, 3)

但是,以下调用失败:

genfun(a = 1:5, b = 3)

然而,如果我们返回与泛型参数名称匹配的方法的第一个定义:

genfun.numeric <- function(x, y) {
  x[y]
}

带有命名参数的调用可以正常工作:

genfun(x = 1:5, y = 3)

或:

genfun(y = 3, x = 1:5)

有没有办法使基于参数ab 的方法定义在使用命名参数调用时也有效?

【问题讨论】:

  • 为什么要标记amazon-s3
  • 为什么需要这个?最好使用与泛型中相同的参数名称。
  • 我没有使用标签amazon-s3,而只使用了标签s3
  • @Roland:我想这样做的原因是因为我最终想对第二个参数进行调度,这可能碰巧在不同的方法中有不同的名称。但我同意这可能不是一个好主意。只是在我进行更改之前进行检查。
  • “我最终希望对第二个参数进行调度”,这在 S3 中是不可能的。

标签: r dispatch


【解决方案1】:

是的,有。定义除点参数之外的通用 没有 参数。

genfun <- function(...) UseMethod("genfun")

现在两种方法都可以使用或不使用命名参数。

genfun.numeric <- function(x, y) {
  x[y]
}

genfun(1:5, 3)
#[1] 3

还有另一个。

genfun.numeric <- function(a, b) {
  a[b]
}

genfun(1:5, 3)
#[1] 3

genfun(a = 1:5, b = 3)
#[1] 3

【讨论】:

  • 太好了,非常感谢。如果现在我想在第二个参数而不是第一个参数上进行调度怎么办?还有可能吗?
  • @choisy 不,我不这么认为。 S3 方法在第一个参数上分派。
  • 默认情况下在第一个参数上分派,如果需要,您可以选择在另一个参数上分派。为此,您只需以这种方式定义泛型:genfun &lt;- function(x, y, ...) UseMethod("genfun", y)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多