Можно ли отправлять методы S3 на основе класса аргумента, заданного только его позицией? - PullRequest
0 голосов
/ 18 декабря 2018

Представьте, что у нас есть следующий универсальный 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, также работало при вызове с именованным аргументом?

1 Ответ

0 голосов
/ 18 декабря 2018

Да, есть.Определите общие без аргументов, отличных от аргумента точек.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...