Как написать универсальную функцию с двумя входами? - PullRequest
12 голосов
/ 03 апреля 2019

Я новичок в программировании, и у меня возникла проблема с 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, так как есть два входа?Мои попытки и ошибки приведены ниже: </p>

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 Ответ

10 голосов
/ 03 апреля 2019

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