设计可以在 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.Algo1
,MyFun.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")
)
})
确保 Algo1
和 Algo2
进行一些参数检查以确保他们收到他们期望的参数可能是明智的。这通常是良好的编程习惯,但在这里可能更重要。
如果您以前没有遇到过 match.arg
,这是确保参数与定义的一组值之一匹配的推荐方法。它使用默认参数作为允许值列表。
我有一个 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.Algo1
,MyFun.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")
)
})
确保 Algo1
和 Algo2
进行一些参数检查以确保他们收到他们期望的参数可能是明智的。这通常是良好的编程习惯,但在这里可能更重要。
如果您以前没有遇到过 match.arg
,这是确保参数与定义的一组值之一匹配的推荐方法。它使用默认参数作为允许值列表。