2016-02-09 2 views
3

Я недавно (очень) начал изучать функции S3 в R. Я работаю в функции, где я предвижу наличие общих операций между различными методами. Не знаете, как это должно быть сделано. Например:Общие операции между несколькими методами S3

myfun <- function (x) { 
UseMethod("myfun") 
} 

myfun.numeric <- function(x) { 
    a<-x+5 
    b<-a^2 
    c<-b+4 
    d<-c-3 
    d 
} 

myfun.character <- function(x) { 
    a<-as.numeric(x)+9 
    b<-a^2 
    c<-b+4 
    d<-c-3 
    d 
} 

myfun("3") 
myfun(3) 

Функция в это время не слишком длинная. Я предполагаю, что технически я могу иметь функцию, которая выполняет часть, представленную буквой «a», затем имеет общую функцию, выполняющую шаги «b», «c» и «d». В некоторых случаях функции могут быть довольно короткими, и наличие дополнительной функции, по-видимому, не является лучшей практикой. Что обычно делается в таких случаях?

+0

Это выглядит довольно стандартно, если нужно перегрузить функцию. Опасность может возникнуть, если вы соблазнили пользователей вашего кода в ситуациях, когда факторы обрабатывались, считая их численными. –

ответ

1

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

1) метод по умолчанию Поместите общий код по умолчанию и используйте NextMethod().

myfun <- function (x) UseMethod("myfun") 

myfun.numeric <- function(x) { 
    x<-x+5 
    NextMethod() 
} 

myfun.character <- function(x) { 
    x <-as.numeric(x)+9 
    NextMethod() 
} 

myfun.default <- function(x) { 
    b<-x^2 
    c<-b+4 
    d<-c-3 
    d 
} 

myfun("3") 
myfun(3) 

2) общая функция Поочередно просто поставить общий код в отдельную функцию под названием common, скажем, и назвать его.

myfun <- function (x) UseMethod("myfun") 

myfun.numeric <- function(x) { 
    y <-x+5 
    common(y) 
} 

myfun.character <- function(x) { 
    y <-as.numeric(x)+9 
    common(y) 
} 

common <- function(x) { 
    b<-x^2 
    c<-b+4 
    d<-c-3 
    d 
} 

myfun("3") 
myfun(3) 
Смежные вопросы