Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R编程:使用setMethod覆盖';总结';一组类的函数_R_S4 - Fatal编程技术网

R编程:使用setMethod覆盖';总结';一组类的函数

R编程:使用setMethod覆盖';总结';一组类的函数,r,s4,R,S4,我正在使用setMethod为不同类的对象重写“summary”函数 最初,我使用了这种方法: setMethod('summary', "class_1", function(object, ...) { #code for class_1 summary here... } ) setMethod('summary', "class_2", function(object, ...)

我正在使用setMethod为不同类的对象重写“summary”函数

最初,我使用了这种方法:

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(
  1:length(all_classes()),
  function(k)
    setMethod('summary', all_classes()[k],
                function(object, ...) {
                  #code here...
                }
    )
)
这是可行的,但我想知道是否有更好的方法来实现我的目标,即为每个不同的类紧凑地创建一个“摘要”函数

谢谢


John.

门面模式在底层工作区功能的基础上实现了轻量级方法。通常,每个方法在调用work horse函数之前都会进行一些初步处理。在简单的情况下,没有预处理,并且您对setClass的返回值不感兴趣,使用for循环而不是lappy是有意义的。所以

.my_summary <- function(object, ...) {}
for (cl in all_classes())
    setMethod(summary, cl, .my_summary)
在S4中,可以使用多重继承来提供一种面向方面的编程

setClass("Summary")
setMethod(summary, "Summary", function(object, ...) {})
setClass("B1", contains=c("A", "Summary"))

B1然后从A继承数据(插槽x),从摘要继承行为。在这种情况下,方法分派可能会令人困惑(如果摘要和摘要都有摘要方法,则选择哪种方法?。

谢谢@Martin。我还遇到了另一个简洁的解决方案,使用setClassUnion(“groupName”,c(“class_1”,“class_2”,“class_3”))等,然后为“groupName”定义一个摘要函数。
setClass("Summary")
setMethod(summary, "Summary", function(object, ...) {})
setClass("B1", contains=c("A", "Summary"))