我具有以下功能:
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
类型的对象列表?
答案 0 :(得分:1)
如果您要编写不同的方法来处理类foo
的列表和类bar
的列表,则S4将需要一些帮助,因为这两个对象都属于类list
,因此,两种情况下都将调用相同的方法。
有几种选择:
首先,您是否需要使用列表?不要忘记R中的所有基类型都是向量,因此对于简单的类,如
setClass("cuboid",slots=list(
height="numeric",
width="numeric",
depth="numeric"
)) -> cuboid
如果要表示一组多个长方体,则根本不需要使用列表,只需将值的向量馈送到cuboid
。但是,这对于更多奇特的类来说效果不佳。
list
方法来确定要调度的低阶方法。您还应该考虑如果列表包含多个不同类的对象该怎么办。
在某些情况下,您可能可以使用lapply
或通过...
接受任意数量参数的函数。在后一种情况下,您可以使用dotsMethods
(有关更多信息,请查看该主题的帮助页面)。
如果您要编写仅在类foo
的对象列表上调用的方法,并且可能存在另一个要在列表上操作的方法,则可以:
foo
写一个方法,然后使用sapply
或lapply
而不是在列表上调用函数list
编写一个方法,该方法检查列表中是否包含foo
,如果没有,则调用nextMethod
。