2012-02-13 17 views
14

Rは関数のオーバーロードをサポートしていますか?R - 関数のオーバーロード

私はの行に何かをしたい:

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

を見たいと思うでしょうあなたの例の関数は、(オプションの引数の単純なケースを提案後述のように)、関数のオーバーロードは、Rのメソッド[dispatching systems](http://cran.at.r-project.org/doc/manuals/R-lang.html# Object_002Doorient-programming)S3およびS4。 – joran

+0

はい、これはオプションの引数で行うことができますが、私はErlangの関数定義に似た何かを探しています:-) – MadSeb

+0

良い提案、@joran。あなたは私にそれを打つ*と*最も適切なリンクを提供した。 –

答えて

13

EDIT、上記のコメントでの質問の明確化以下:Erlangのは、あなたが応じて全く異なる方法を派遣する関数を定義することができますようにthis pageでチラッから

、それが見えます(最大で...まで、引き数はオプションであり、ディスパッチされたメソッドには影響しません)。

Rのようなことをするには、おそらくS4のクラスとメソッドを使いたいと思うでしょう。 S3システムでは、ディスパッチされるメソッドは最初の引数のクラスのみに依存します。 S4システムでは、呼び出されるメソッドは任意の数の引数のクラスに依存する可能性があります。

可能性のある例の1つとして、以下を実行してみてください。 rasterパッケージとspパッケージの両方をインストールする必要があります。それらの間には、ラスタ空間データとベクトル空間データの両方をプロットするための多数の関数が用意されており、どちらもS4システムを使用してメソッドディスパッチを実行します。 showMethods()への呼び出しによって返された各行は、plot()が指定されたクラス(完全に"missing"を含むことができる)を持つxy引数を渡されたときに送出される別の関数に対応します。

> 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を入力することで、機能があること実現する方法を見て行きます。たとえば、試してみてください。

一般的に、このようなことを自分でどのように実装するのかを知る最も良い方法は、動作がすでにわかっている関数を定義するために使用されるコードで時間を費やすことです。あなたはメソッドディスパッチのより洗練されたフォームを探求したい場合

その後、あなたはR.

によって提供S3およびS4クラスのシステムの両方に
8

これは、通常、最良のオプションの引数を介して行われます。たとえば、次のように

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

これは大丈夫です! g < - function(X、FALSE){#do something} g < - function(X、TRUE){#do something} これはErlang/Prologue関数に似ています定義/引数マッチング:-) これはRで実行できるのかどうか? – MadSeb

+0

あなたが記述しているコードはRではうまくいかないでしょう。@ JoshOBrienの答えで議論されているように、あなたが探しているものはメソッドディスパッチであり、何をしたいのかに応じていくつかの研究が必要です。 –

関連する問題