R编程: Use of setMethod to override the 'summary' function for a group of classes

标签 r r-s4

我正在使用 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...
          }          
)

...每个类(class)依此类推。

但是,总共有 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 适用于多个类,这意味着这些类共享公共(public)结构,因此可以排列为类层次结构和在基类上定义的方法。

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/

相关文章:

来自不同包的同名 R S4 类

当 setMethod(或 setGeneric)中的参数太多时,R 会挂起

R为 "Matrix"和NULL创建虚拟类

r - 如何对 dplyr 中的多个变量进行排名

r - 在估算的数据框中包含 ID 变量

r - 如何使用 dplyr 对另一个表中的数据进行计算?

r - 循环遍历 R 中动态创建的 S4 类中的变量

R:使用 lapply 创建新列和值并应用嵌套在 data.frame 列表上,错误输出

R 函数和 Rcpp 函数计算最近正定矩阵的结果不同

引用类、制表符补全和强制方法定义