是否可以仅根据其位置指定的参数的类来调度S3方法?

时间:2018-12-18 10:49:25

标签: r dispatch

想象一下,我们想使用以下第一个参数的类来调度以下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的方法定义在使用命名实参调用时也可以工作?

1 个答案:

答案 0 :(得分:0)

是的,有。修饰除点参数外的通用不带参数。

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