Как UseMethod работает в R - PullRequest
1 голос
/ 27 июня 2019
h <- function(x) {
  x <- 10
  UseMethod("h")
}
h.character <- function(x){ paste("char", x)}
h.numeric <- function(x) { paste("num", x)}
h("a")

Приведенный выше код выведет:

[1] "char a"

Мои дедуктивные рассуждения, приведенные ниже, говорят, что на выходе должно быть "char 10".

Согласно документации по методу использования:

  1. Найти контекст для вызывающей функции (универсальный): это дает нам неоцененные аргументы для исходного вызова.

  2. Оцените объект (обычно аргумент), который будет использоваться для отправки, и найдите метод (возможно, метод по умолчанию) или сгенерируйте ошибку.

  3. Создайте среду для оценки метода и вставьте специальные переменные (см. Ниже) в эту среду. Также скопируйте любые переменные в среде универсального, которые не являются формальными (или фактическими) аргументами.

  4. Исправьте список аргументов, чтобы они соответствовали аргументам вызова, соответствующим формальным значениям метода.

Если я правильно понимаю, на шаге 2 x будет оцениваться как 'a' Но затем на шаге 3 другая переменная x со значением 10 вставляется в среду для выполнения метода.

Разве это не переопределило бы x сейчас 10? И, наконец, на шаге 4 аргументы сопоставляются с аргументами метода. Итак, x, равное 10, теперь является аргументом метода.

Что я не так поняла

1 Ответ

2 голосов
/ 27 июня 2019

From? UseMethod

Отправка метода происходит на основе класса (классов) первого аргумента универсальной функции или объекта, переданного в качестве аргумента для UseMethod или NextMethod.

Таким образом, в этом случае

h <- function(x) {
  x <- 10
  UseMethod("h")
}

h("a")
#[1] "char a"

какая функция вызывается, зависит от класса "a" при вызове h с использованием h("a") ( класс (ы) первого аргумента универсальной функции ).

Но если у вас есть

h <- function(x) {
  x <- 10
  UseMethod("h", x)
}

h("a")
#[1] "num a"

и при вызове h("a") он вызовет h.numeric поскольку задан класс UseMethod ( class (s) ... объекта, предоставленного в качестве аргумента для UseMethod ).


Итак, следующеевыдаст "char 10" в качестве вывода при вызове универсальной функции.

zz <- function(x) {

   UseMethod("zz", "w")
}
zz.character <- function(x){ paste("char", x)}
zz.numeric <- function(x) { paste("num", x)}

zz(10)
#[1] "char 10"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...