【问题标题】:R - Function overloadingR - 函数重载
【发布时间】:2023-03-24 17:41:01
【问题描述】:

R 是否支持函数重载?

我想做一些事情:

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

【问题讨论】:

  • 您的示例函数建议使用可选参数的简单情况(如下所述),但“函数重载”可能指的是更多类似于 R 的方法 dispatching systems S3 和 S4 的内容。
  • 是的,这可以通过可选参数来完成,但我正在寻找类似于 Erlang 函数定义的东西 :-)
  • 好建议,@joran。你打败了我并且提供了最合适的链接。
  • 在问题中添加有关 Erlang 函数定义的信息,目前这不是一个真正的问题。

标签: r function overloading


【解决方案1】:

编辑,在上面的 cmets 中澄清问题后

快速浏览this page,看起来Erlang 允许您定义函数,这些函数将根据参数列表的数量来调度完全不同的方法(最多为...,其后参数是可选的/不影响调度的方法)。

要在 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"

确实如此。试一试:

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

然后通过键入plot.default 来看看函数是如何实现的。

一般来说,了解如何自己实现此类事情的最佳方法是花一些时间研究用于定义行为您已经熟悉的函数的代码。

然后,如果您想探索更复杂的方法分派形式,则需要研究 R 提供的 S3 和 S4 类系统。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这看起来不错!我认为这样的事情会更好: g
    • 您描述的代码在 R 中不起作用。您正在寻找的可能是方法调度,正如@JoshOBrien 的回答所讨论的那样,并且需要根据您想要的确切内容进行一些研究做。
    【解决方案3】:

    查看 R 中的 missing() 函数。要使函数继续运行,您需要在运行函数的其余部分之前重新分配缺失的变量。例如这段代码:

    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() 函数只有在您没有更改函数中的相关变量时才可靠。

    【讨论】:

    • 不错,简单明了。应该是这样。很多谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2017-08-06
    相关资源
    最近更新 更多