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}
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}
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.
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
}
}
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
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ć. –
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
tak, można to zrobić za pomocą opcjonalnych argumentów, ale szukam czegoś podobnego do definicji funkcji Erlanga :-) – MadSeb
Dobra sugestia, @joran. Uderzyłeś mnie w to * i * podałem najbardziej odpowiedni link. –