2012-02-13 33 views
14

Czy R obsługuje przeciążenie funkcji?R - Funkcja przeciążania

chcę zrobić coś w linii:

g <- function(X,Y) { # do something and return something } 
g <- function(X) { # do something and return something} 
+4

swoim przykładzie funkcje sugerują prosty przypadek argumentów opcjonalnych (jak omówiono poniżej), ale "przeciążanie funkcji" może odnosić się do czegoś bardziej wzdłuż metody R [systemów dyspozytorskich] (http://cran.at.r-project.org/doc/manuals/R-lang.html# Object_002dorientowane-programowanie) S3 i S4. – joran

+0

tak, można to zrobić za pomocą opcjonalnych argumentów, ale szukam czegoś podobnego do definicji funkcji Erlanga :-) – MadSeb

+0

Dobra sugestia, @joran. Uderzyłeś mnie w to * i * podałem najbardziej odpowiedni link. –

Odpowiedz

13

EDIT, po wyjaśnieniu kwestii w komentarzach powyżej:

Od szybki rzut oka na this page, wygląda Erlang pozwala określić funkcje, które wyśle ​​całkowicie różne metody w zależności na podstawie ich listy argumentów (do ..., po której argumenty są opcjonalne/nie mają wpływu na metodę wysłania).

Aby zrobić coś takiego w R, prawdopodobnie będziesz chciał używać klas i metod S4. W systemie S3 wywoływana metoda zależy wyłącznie od klasy pierwszego argumentu. W systemie S4 wywoływana metoda może zależeć od klas dowolnej liczby argumentów.

Dla przykładu tego, co jest możliwe, spróbuj wykonać następujące czynności. Wymaga zainstalowania pakietu raster i pakietu . Między nimi zapewniają dużą liczbę funkcji do drukowania zarówno danych przestrzennych rastrowych, jak i wektorowych, a obie z nich wykorzystują system S4 do przeprowadzenia wysyłki metod. Każda z linii zwróconych przez wywołanie do showMethods() odpowiada oddzielnej funkcji, która zostanie wysłana po przekazaniu plot()x i y argumentów, które mają wskazane klasy (które mogą obejmować całkowicie "missing").

> library(raster) 
> showMethods("plot") 
Function: plot (package graphics) 
x="ANY", y="ANY" 
x="Extent", y="ANY" 
x="Raster", y="Raster" 
x="RasterLayer", y="missing" 
x="RasterStackBrick", y="ANY" 
x="Spatial", y="missing" 
x="SpatialGrid", y="missing" 
x="SpatialLines", y="missing" 
x="SpatialPoints", y="missing" 
x="SpatialPolygons", y="missing" 

R pewno nie. Spróbuj, na przykład:

plot(x = 1:10) 
plot(x = 1:10, y = 10:1) 

a następnie przejść spojrzeć jak funkcja realizuje, że wpisując plot.default.

Ogólnie rzecz biorąc, najlepszym sposobem, aby dowiedzieć się, jak wdrożyć tego rodzaju rzeczy, będzie poświęcić trochę czasu na krojenie w kodzie używanym do definiowania funkcji, których zachowanie jest już znane.

Następnie, jeśli chcesz poznać bardziej wyrafinowane formy metody wysyłki, będziemy chcieli przyjrzeć się zarówno do systemów klasy S3 i S4 dostarczonych przez R.

8

Zazwyczaj jest to najlepiej zrobić za pośrednictwem opcjonalnych argumentów. Na przykład:

g <- function(X, Y=FALSE) { 
    if (Y == FALSE) { 
     # do something 
    } 
    else { 
     # do something else 
    } 
} 
+0

to wygląda dobrze! Myślę, że coś takiego byłoby jeszcze ładniejsze: g <- function (X, FALSE) {# coś zrobić} g <- function (X, TRUE) {# coś zrobić} jest to podobne do funkcji Erlang/Prologue dopasowanie definicji/argumentu :-) jakikolwiek pomysł, czy można to zrobić w R? – MadSeb

+0

Kod, który opisujesz, nie zadziała w R. To, czego szukasz, może być ekspedycją metod, o czym mówi odpowiedź @ JoshOBrien, i wymaga pewnych badań w zależności od tego, co dokładnie chcesz zrobić. –