R - функция перегрузки - PullRequest
       20

R - функция перегрузки

15 голосов
/ 13 февраля 2012

R поддерживает перегрузку функции ??

Я хочу сделать что-то в строках:

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

Ответы [ 2 ]

14 голосов
/ 13 февраля 2012

РЕДАКТИРОВАТЬ, после разъяснения вопроса в комментариях выше :

С первого взгляда на эта страница , похоже, что Erlang позволяет вам определять функции, которыебудет отправлять совершенно разные методы в зависимости от арности их списка аргументов (до ..., после чего аргументы являются необязательными / не влияют на отправленный метод).

Чтобы сделать что-то подобное в Rвы, вероятно, захотите использовать классы и методы S4.В системе S3 отправляемый метод зависит исключительно от класса первого аргумента.В системе S4 вызываемый метод может зависеть от классов произвольного числа аргументов.

Для одного примера того, что возможно, попробуйте выполнить следующее.Требуется, чтобы вы установили как пакет raster, так и пакет sp.Между ними они предоставляют большое количество функций для построения как растровых, так и векторных пространственных данных, и обе они используют систему S4 для выполнения метода диспетчеризации.Каждая из строк, возвращаемых при вызове showMethods(), соответствует отдельной функции, которая будет отправлена ​​при передаче plot() x и y аргументов, имеющих указанные классы (которые могут включать в себя полностью "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 обязательно.Попробуйте для примера:

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

А затем посмотрите, как эта функция выполняется, набрав plot.default.

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

Затем, если вы хотите изучить более сложные формы диспетчеризации методов, вам нужно изучить системы классов S3 и S4, предоставленные R.

9 голосов
/ 13 февраля 2012

Обычно это лучше всего сделать с помощью необязательных аргументов. Например:

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