R - Перегрузка функций

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

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

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

Ответы

Ответ 1

EDIT, после разъяснения вопроса в комментариях выше:

С быстрым взглядом на эту страницу, похоже, что 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.

Ответ 2

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

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

Ответ 3

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

overload = function(x,y) {
  if (missing(y)) {
    y = FALSE
  }

  if (y == FALSE) {
    print("One variable provided")
  } else {
    print("Two variables provided")
  }
}

overload(1)
overload(1, 2)

Вернется:

> overload(1)
[1] "One variable provided"
> overload(1, 2)
[1] "Two variables provided"

Наконец, функция missing() надежна только в том случае, если вы не изменили указанную переменную в функции.