Как использовать S3-классы R вместе с параметрами? - PullRequest
1 голос
/ 21 сентября 2019

Боюсь, я что-то неправильно понял.Основы взяты из здесь и базовый (минимальный) пример понятен (я думаю) и работает:

fun.default <- function(x) { # you could add further fun.class1 (works)...
  print("default")
  return(x[1] + x[2])
}

my_fun <- function(x) {
  print("my_fun")
  print(x)
  res <- UseMethod("fun", x)
  print(res)
  print("END my_fun...")
  return(res)
}
x <- c(1, 2)
my_fun(x)

Однако, если я хочу добавить параметры, что-то идет не так.Сформируйте ссылку выше:

Как только UseMethod нашел правильный метод, он вызывается особым образом.Вместо создания новой среды оценки он использует среду текущего вызова функции (вызова универсального), поэтому любые присвоения или оценки, которые были сделаны до вызова UseMethod, будут доступны методу.

Я перепробовал все возможные варианты:

my_fun_wrong1 <- function(x, y) {
  print("my_fun_wrong1")
  print(x)
  x <- x + y
  print(x)
  res <- UseMethod("fun", x)
  print(res)
  print("END my_fun_wrong1...")
  return(res)
}
x <- c(1, 2)
# Throws: Error in fun.default(x, y = 2) : unused argument (y = 2)
my_fun_wrong1(x, y = 2)

my_fun_wrong2 <- function(x) {
  print("my_fun_wrong2")
  print(x)
  x <- x + y
  print(x)
  res <- UseMethod("fun", x)
  print(res)
  print("END my_fun_wrong2...")
  return(res)
}
x <- c(1, 2)
y = 2
# Does not throw an error, but does not give my expetced result "7": 
my_fun_wrong2(x) # wrong result!?
rm(y)

my_fun_wrong3 <- function(x, ...) {
  print("my_fun_wrong3")
  print(x)
  x <- x + y
  print(x)
  res <- UseMethod("fun", x)
  print(res)
  print("END my_fun_wrong3...")
  return(res)
}
x <- c(1, 2)
# Throws: Error in my_fun_wrong3(x, y = 2) : object 'y' not found
my_fun_wrong3(x, y = 2)

Редактировать после ответа Г. Гротендик: Используя fun.default <- function(x, ...), я получаю

Запускается после изменения, но я не понимаю результат:

my_fun_wrong1(x, y = 2)
[1] "my_fun_wrong1"
[1] 1 2
[1] 3 4         # Ok
[1] "default"
[1] 3           # I excpect 7

Как и прежде - я не понимаю результат:

my_fun_wrong2(x) # wrong result!?
[1] "my_fun_wrong2"
[1] 1 2
[1] 3 4        # Ok!
[1] "default"
[1] 3          # 3 + 4 = 7?

Все равно выдает ошибку:

my_fun_wrong3(x, y = 2)
[1] "my_fun_wrong3"
[1] 1 2
Error in my_fun_wrong3(x, y = 2) : object 'y' not found

Я думаю, этот вопрос действительно полезен!

1 Ответ

2 голосов
/ 21 сентября 2019

fun.default необходимо ..., чтобы дополнительный аргумент соответствовал.

fun.default <- function(x, ...) {
  print("default")
  return(x[1] + x[2])
}

x <- c(1, 2)
my_fun_wrong1(x, y = 2)
## [1] "my_fun_wrong1"
## [1] 1 2
## [1] 5 6
## [1] 3

Кроме того, любые операторы после вызова UseMethod в универсальном не будут оцениваться как UseMethodне возвращать, поэтому бессмысленно ставить код после него в общем.

Кроме того, вы не можете переопределить аргументы для UseMethod.Аргументы передаются по мере их поступления.

Предложите просмотреть файл справки ?UseMethod, хотя по общему признанию это может быть трудно прочитать.

Относительно цитаты из ?UseMethod, которая была добавленана вопрос, это просто означает, что методы могут обращаться к локальным переменным, определенным в функции, вызывающей UseMethod. не означает, что вы можете переопределить аргументы.Ниже ff.default относится к a, определенному в ff.

a <- 0
ff <- function(x, ...) { a <- 1; UseMethod("ff") }
ff.default <- function(x, ...) a

ff(3)
## [1] 1
...