R - 函数重载

Mad*_*Seb 17 overloading r function

R支持函数重载吗?

我想做的事情是:

g <- function(X,Y) { # do something and return something } 
g <- function(X) { # do something and return something} 
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 14

编辑,在上述评论中澄清问题后:

这个页面快速浏览一下,看起来Erlang允许你定义函数,这些函数将根据参数列表的arity分配完全不同的方法(最多a ...,后面的参数是可选的/不影响调度的方法).

要在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"
Run Code Online (Sandbox Code Playgroud)

确定没问题.试试看一个例子:

plot(x = 1:10)
plot(x = 1:10, y = 10:1)
Run Code Online (Sandbox Code Playgroud)

然后通过输入来查看函数如何实现这一点plot.default.

一般来说,学习如何自己实现这种事情的最佳方法是花一些时间在用于定义行为已经熟悉的函数的代码中.

然后,如果您想探索更复杂的方法调度形式,您将需要查看R提供的S3和S4类系统.


Dav*_*son 8

这通常最好通过可选参数完成.例如:

g <- function(X, Y=FALSE) {
    if (Y == FALSE) {
        # do something
    }
    else {
        # do something else
    }
}
Run Code Online (Sandbox Code Playgroud)