我正在使用setMethod覆盖不同类的对象的“摘要”功能。

最初,我使用这种方法:

setMethod('summary', "class_1",
           function(object, ...) {
            #code for class_1 summary here...
          }
)

setMethod('summary', "class_2",
          function(object, ...) {
            #code for class_2 summary here...
          }
)

setMethod('summary', "class_3",
          function(object, ...) {
            #code for class_3 summary here...
          }
)

...依此类推

但是,总共有12个不同的类,因此代码变得非常重复。
为了避免这种重复,我创建了一个包含类名称的函数:
all_classes = function() {
  c("class_1", "class_2", "class_3") #and so on for each class
}

然后我用lapply:
lapply(
  1:length(all_classes()),
  function(k)
    setMethod('summary', all_classes()[k],
                function(object, ...) {
                  #code here...
                }
    )
)

这可行,但是我想知道是否有更好的方法来实现我的目标,即为每个不同的类紧凑地创建一个“摘要”函数。

谢谢,

约翰。

最佳答案

外立面模式在底层工作马功能之上实现了轻量级方法。通常,每种方法在调用“工作马”功能之前都会进行一些初步处理。在没有初步处理且您对setClass的返回值不感兴趣的简单情况下,使用for循环而不是lapply是有意义的。所以

.my_summary <- function(object, ...) {}
for (cl in all_classes())
    setMethod(summary, cl, .my_summary)

而且,.my_summary可在多个类上工作意味着这些类具有相同的结构,因此可以安排为一个类层次结构和一个在基类上定义的方法。
setClass("A", representation(x="numeric"))
setClass("A1", contains="A")
setClass("A2", contains="A")
setMethod(summary, "A", function(object, ...) {})

在S4中,可以使用多重继承来提供一种面向方面的编程
setClass("Summary")
setMethod(summary, "Summary", function(object, ...) {})
setClass("B1", contains=c("A", "Summary"))

然后,B1从A继承数据(插槽x),并从Summary继承行为。这种情况下的方法分派(dispatch)可能会引起混淆(如果A和Summary都具有摘要方法,则选择哪种方法?)。

关于R编程: Use of setMethod to override the 'summary' function for a group of classes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17124463/

10-12 14:00