2012-02-13 88 views
14

R是否支持函數重載?R - 函數重載

我想要做的事中的臺詞:

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

你的功能。例如建議的可選參數的簡單情況下,S3和S4級系統(如下所述),但'函數重載'可能指的是更多沿着R的方法[調度系統](http://cran.at.r-project.org/doc/manuals/R-lang.html#面向對象編程)S3和S4。 – joran 2012-02-13 19:02:23

+0

是的,這可以通過可選參數來完成,但我正在尋找類似於Erlang函數定義的東西:-) – MadSeb 2012-02-13 19:05:25

+0

好的建議,@joran。你擊敗了我*並*提供了最合適的鏈接。 – 2012-02-13 19:10:30

回答

13

編輯,以下澄清的問題在上述評論

從快速瀏覽一下this page,它看起來像二郎允許你定義函數將派出完全不同的方法取決於在它們的參數列表(最多...,後面的參數是可選的/不影響調度的方法)的參數。

要做類似於R的事情,你可能會想使用S4類和方法。在S3系統中,調度的方法完全取決於第一個參數的類。在S4系統中,調用的方法可以依賴於任意數量參數的類。

有關可能的一個示例,請嘗試運行以下內容。它要求您安裝了raster包和sp包。在它們之間,它們提供了大量用於繪製柵格和矢量空間數據的函數,並且它們都使用S4系統執行方法調度。通過調用showMethods()返回的每一行對應於一個單獨的函數,當plot()通過xy具有指定類別(其可以完全包括"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

一般來說,學習如何自己實現這種類型的最好方法是花費一些時間在用於定義其行爲已爲您熟悉的函數的代碼中使用。

然後,如果你想探索方法分派的更復雜的形式,你會想看看這兩個由R.提供

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 2012-02-13 19:06:48

+0

您所描述的代碼在R中不起作用。您所尋找的代碼可能是方法調度,正如@Joshobrien的答案所討論的那樣,並且需要根據您想要執行的操作進行一些研究。 – 2012-02-13 19:14:47