设计可以在 R 中为 S4 class 实现多种算法的函数的推荐模式是什么?

What is the recommended pattern to design a function that can implement multiple algorithms for S4 class in R?

我有一个 class S4 "MyOb" 的对象和一个 "MyFun" 的泛型函​​数。我想为 MyFun 实现多种不同的算法来处理 MyOb 并能够通过在通用函数中指定 "type" 来 select 我想要的算法。类型将是 MyFun 的参数,并且只是一个字符(字符串):"Algo1"、"Algo2"...

但是,每个算法都需要不同的参数。我已经开始在下面的代码中指出,但我不确定如何继续,我应该在 setMethod 函数中有一个 switch 重定向到其他单独的函数吗?

setGeneric("MyFun", function(x, type, ...) standardGeneric("MyFun"))

setMethod("MyFun", c("MyOb", "character"), function(x, type, ...){

       switch()??? #to Algo1, Algo2, ....
})

Algo1<-function(x, M, N){ #blabla }
Algo2<-function(x, F, G, H){ #blablabla }

理想情况下,我喜欢以 baseline R 包中的函数 baseline 结束,其中 MyFun.Algo1MyFun.Algo2 是不同的函数,MyFun 是通用函数...

我一直在寻找这种模式,但找不到任何教程...

如有任何提示、建议、建议,我们将不胜感激!

非常感谢!

首先,您可能只想将 x 作为函数的签名(例如,您不希望使用基于 type 的 class 的不同方法).所以你应该从

开始
setGeneric("MyFun", function(x, type, ...) standardGeneric("MyFun"), signature="x")

(如果您不想的话,您甚至不必在泛型的参数中包含 type — 这取决于它是否会用于其他 class 输入.)

如果您以后的算法需要不同的其他参数,那很好。 ... 为您解决了这个问题。所以如果你有两种算法

Algo1<-function(x, M, N){ #blabla }
Algo2<-function(x, F, G, H){ #blablabla }

然后这些将在您调用时正确调用

MyFun(x,type="Algo1",M=1,N=2) ## dispatched Algo1 with M=1 and N=2
MyFun(x,type="Algo2",F=3,G=4,H=-2.7) ## dispatches Algo2 with F, G and H

MyFun方法的推荐写法如下(你的直觉是对的switch):

setMethod("MyFun",signature(x="MyObj"), function(x,type=c("Algo1","Algo2"),...){
  type <- match.arg(type)
  switch(type,
    Algo1=Algo1(x,...),
    Algo2=Algo2(x,...),
    stop("unknown algorithm")
  )
})

确保 Algo1Algo2 进行一些参数检查以确保他们收到他们期望的参数可能是明智的。这通常是良好的编程习惯,但在这里可能更重要。

如果您以前没有遇到过 match.arg,这是确保参数与定义的一组值之一匹配的推荐方法。它使用默认参数作为允许值列表。