[Bioc-devel] Virtual class for `matrix` and `DelayedArray`? (or better strategy for dealing with them both)

Elizabeth Purdom epurdom at stat.berkeley.edu
Mon Apr 30 16:02:01 CEST 2018


Hello,

I am trying to extend my package to handle `HDF5Matrix` class ( or more generally `DelayedArray`). I currently have S4 functions for `matrix` class. Usually I have a method for `SummarizedExperiment`, which will call call the method on `assay(x)` and I want the method to be able to deal with if `assay(x)` is a `DelayedArray`.

Most of my functions, however, do not require separate code depending on whether `x` is a `matrix` or `DelayedArray`. They are making use of existing functions that will make that choice for me, e.g. rowMeans or subsetting. My goal right now is compatibility, not cleverness, and I'm not creating HDF5 methods to handle other cases. (If something doesn't currently exist, then I just enclose `x` with `data.matrix` or `as.matrix` and call the matrix into memory — for cleanliness and ease in updating with appropriate methods in future, I could make separate S4 functions for these specific tasks to dispatch, but that's outside of the scope of my question). So for simplicity assume I don't really need to dispatch *my code* -- that the methods I'm going to use do that. 

The natural solution for me seem to use `setClassUnion` and I was wondering if such a virtual class already exists? Or is there a better way to handle this?

Here's a simple example, using `rowMeans` as my example:

```
setGeneric("myNewRowMeans", function(x,...) { standardGeneric("myNewRowMeans")})
setClassUnion("matrixOrDelayed",members=c("matrix", "DelayedArray"))

#' @importFrom DelayedArray rowMeans
setMethod("myNewRowMeans", 
          signature = "matrixOrDelayed",
          definition = function(x,...){
		  	# a lot of code independent of x
			print("This is a lot of code shared regardless of class of x\n")
			# a lot of code that depends on x, but is dispatched by the functions called
		  	out<-rowMeans(x)
		  	#a lot of code based on output of out
		  	out<-out+1
		  	return(out)	
		}
)
```



More information about the Bioc-devel mailing list