首页 > 解决方案 > 是否可以仅根据其位置指定的参数类来调度 S3 方法?

问题描述

想象一下,我们有以下 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)

有没有办法使方法定义基于参数a并且b在使用命名参数调用时也可以工作?

标签: rdispatch

解决方案


就在这里。定义除了点参数之外没有参数的泛型。

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

推荐阅读