Как написать универсальную функцию с двумя входами?

#r #generic-programming

#r #generic-программирование

Вопрос:

Я новичок в программировании, и у меня возникла проблема с R по поводу универсальной функции: как ее написать при наличии нескольких входов?

Для простого примера, для набора данных и функции

 z <- c(2,3,4,5,8)
calc.simp <- function(a,x){a*x 8}
# Test the function:
calc.simp(x=z,a=3)
[1] 14 17 20 23 32
  

Теперь я меняю класс z:
class(z) <- ‘simp’
Как я должен написать универсальную функцию ‘calc’, поскольку есть два входа?
Мои попытки и ошибки приведены ниже:

 calc <- function(x) UseMethod('calc',x)
calc(x=z)
Error in calc.simp(x = z) : argument "a" is missing, with no default
  

И

 calc <- function(x,y) UseMethod('calc',x,y)
Error in UseMethod("calc", x, y) : unused argument (y)
  

Мое замешательство может быть фундаментальным, поскольку я всего лишь новичок. Пожалуйста, помогите! Большое вам спасибо!

Комментарии:

1. От чего вы ожидаете возврата calc(x=z) ? Вы не присваиваете своей функции значение для a , и ваша функция зависит от этого. Также вы можете сообщить своей универсальной функции, что могут быть другие аргументы с calc <- function(x, ...) UseMethod('calc',x)

2. Что вы хотите, чтобы ваша функция выполняла? Ваша первая функция (calc.simp) все еще работает даже после изменения класса z .

3. @MrFlick Я просто хочу проверить, может ли моя универсальная функция работать! Это помогает мне лучше понять механизм отправки. ‘Функция (x, …)’ идеально подходит для моего вопроса. Большое вам спасибо! 🙂

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

Ответ №1:

Я бы посоветовал вам смоделировать вашу универсальную функцию на основе шаблона, используемого бесчисленными базовыми функциями R, например, mean :

 > mean
function (x, ...) 
UseMethod("mean")
  

В вашем случае это привело бы к следующему универсальному, который (если я правильно понимаю ваш вопрос) работает просто отлично:

 calc <- function(x, ...) UseMethod('calc')

calc.simp <- function(a, x) {
    x <- unclass(x)
    a * x   8
}


## Try it out

z <- c(2,3,4,5,8)
class(z) <- "simp"

calc.simp(x = z, 10)
## [1] 28 38 48 58 88

calc(x = z, 10)
## [1] 28 38 48 58 88