setGeneric用于对象列表

时间:2019-03-17 16:27:44

标签: r oop s4

我具有以下功能:

myFunction = function(objects,params) {
  for (i in 1:length(objects)) {
     object = objects[[i]]
     object = myOtherFunction(objects, params)
     objects[[i]] = object
  }
 return (objects)
}
#' @rdname myFunction
#' @aliases myFunction
setMethod("myFunction", signature(object ="list"), myFunction)

如何正确设置setMethod()setGeneric()方法以接受给定类型的对象列表,比如说SingleCellExperiment类型的对象列表?

1 个答案:

答案 0 :(得分:1)

如果您要编写不同的方法来处理类foo的列表和类bar的列表,则S4将需要一些帮助,因为这两个对象都属于类list,因此,两种情况下都将调用相同的方法。

有几种选择:

  • 首先,您是否需要使用列表?不要忘记R中的所有基类型都是向量,因此对于简单的类,如

    setClass("cuboid",slots=list( height="numeric", width="numeric", depth="numeric" )) -> cuboid

如果要表示一组多个长方体,则根本不需要使用列表,只需将值的向量馈送到cuboid。但是,这对于更多奇特的类来说效果不佳。

    或者,您可以编写带有一些额外逻辑的list方法来确定要调度的低阶方法。您还应该考虑如果列表包含多个不同类的对象该怎么办。

  • 在某些情况下,您可能可以使用lapply或通过...接受任意数量参数的函数。在后一种情况下,您可以使用dotsMethods(有关更多信息,请查看该主题的帮助页面)。

如果您要编写仅在类foo的对象列表上调用的方法,并且可能存在另一个要在列表上操作的方法,则可以:

  • 直接为类foo写一个方法,然后使用sapplylapply而不是在列表上调用函数
  • 为类list编写一个方法,该方法检查列表中是否包含foo,如果没有,则调用nextMethod