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

Martin Morgan martin.morgan at roswellpark.org
Mon Apr 30 17:28:02 CEST 2018


But that issue will be fixed, so Tim's advice is inappropriate.

On 04/30/2018 10:42 AM, Tim Triche, Jr. wrote:
> Don't do that.  Seriously, just don't.
> 
> https://github.com/Bioconductor/DelayedArray/issues/16
> 
> --t
> 
> On Mon, Apr 30, 2018 at 10:02 AM, Elizabeth Purdom <
> epurdom at stat.berkeley.edu> wrote:
> 
>> 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)
>>                  }
>> )
>> ```
>>
>> _______________________________________________
>> Bioc-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/bioc-devel
>>
> 
> 	[[alternative HTML version deleted]]
> 
> _______________________________________________
> Bioc-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/bioc-devel
> 


This email message may contain legally privileged and/or...{{dropped:2}}



More information about the Bioc-devel mailing list