2016-03-11 3 views
1

Я создаю класс ExpressionSet, используя rpy2, следуя соответствующему tutorial в качестве руководства. Одним из наиболее распространенных вещей, которые я делаю с объектом Eset является Подменят, который в родном R так же просто, какrpy2 для подмножества объекта RS4 (expressionSet)

eset2<-eset1[1:10,1:5] # first ten features, first five samples 

который возвращает новый объект ExpressionSet с подмножествами как данных, выражения и фенотипа, используя данные индексов , Объект RS4 Rpy2, похоже, не позволяет прямое подмножество или имеет атрибуты rx/rx2, в отличие от, например, RS3 векторы. Я попытался с ~ 50% успеха, добавив функцию «_subset» (ниже), которая создает подмножества этих двух наборов данных отдельно и назначает их обратно в Eset, но есть ли более простой способ, которым я не хватает?

from rpy2 import (robjects, rinterface) 
from rpy2.robjects import (r, pandas2ri, Formula) 
from rpy2.robjects.packages import (importr,) 
from rpy2.robjects.methods import (RS4,) 

class ExpressionSet(RS4): 
    # funcs to get the attributes 
    def _assay_get(self): # returns an environment, use ['exprs'] key to access 
     return self.slots["assayData"] 
    def _pdata_get(self): # returns an RS4 object, use .slots("data") to access 
     return self.slots["phenoData"] 
    def _feats_get(self): # returns an RS4 object, use .slots("data") to access 
     return self.slots["featureData"] 
    def _annot_get(self): # slots returns a tuple, just pick 1st (only) element 
     return self.slots["annotation"][0] 
    def _class_get(self): # slots returns a tuple, just pick 1st (only) element 
     return self.slots["class"][0] 

    # funcs to set the attributes 
    def _assay_set(self, value): 
     self.slots["assayData"] = value 
    def _pdata_set(self, value): 
     self.slots["phenoData"] = value 
    def _feats_set(self,value): 
     self.slots["featureData"] = value 
    def _annot_set(self, value): 
     self.slots["annotation"] = value 
    def _class_set(self, value): 
     self.slots["class"] = value 

    # funcs to work with the above to get/set the data 
    def _exprs_get(self): 
     return self.assay["exprs"] 
    def _pheno_get(self): 
     pdata = self.pData 
     return pdata.slots["data"] 

    def _exprs_set(self, value): 
     assay = self.assay 
     assay["exprs"] = value 
    def _pheno_set(self, value): 
     pdata = self.pData 
     pdata.slots["data"] = value 


    assay = property(_assay_get, _assay_set, None, "R attribute 'assayData'") 
    pData = property(_pdata_get, _pdata_set, None, "R attribute 'phenoData'")  
    fData = property(_feats_get, _feats_set, None, "R attribute 'featureData'") 
    annot = property(_annot_get, _annot_set, None, "R attribute 'annotation'")  
    exprs = property(_exprs_get, _exprs_set, None, "R attribute 'exprs'") 
    pheno = property(_pheno_get, _pheno_set, None, "R attribute 'pheno") 


    def _subset(self, features=None, samples=None): 

     features = features if features else self.exprs.rownames 
     samples = samples if samples else self.exprs.colnames 

     fx = robjects.BoolVector([f in features for f in self.exprs.rownames]) 
     sx = robjects.BoolVector([s in samples for s in self.exprs.colnames]) 

     self.pheno = self.pheno.rx(sx, self.pheno.colnames)   
     self.exprs = self.exprs.rx(fx,sx) # can't assign back to exprs this way 

ответ

1

При выполнении

eset2<-eset1[1:10,1:5] 

в R, метод R S4 "[" с подписью ("ExpressionSet") забирается и запустить, используя значения параметров предоставленные вами.

Документация предполагает использование getmethod (см http://rpy2.readthedocs.org/en/version_2.7.x/generated_rst/s4class.html#methods), чтобы облегчить задачу извлечения соответствующего метода S4, но его поведение кажется, изменились после того, как документация была написана (разрешение отправки через наследование уже не сделано).

Следующие должен делать это, хотя:

from rpy2.robjects.packages import importr 
methods = importr('methods') 
r_subset_expressionset = methods.selectMethod("[", "ExpressionSet") 
+0

что работало просто отлично, спасибо @lgautier. Для записи я опубликовал свой код в последующем ответе. – blackgore

0

с благодаря @ lgautier Ответит, вот отрывок из моей выше коды, изменен, чтобы Подменят от RS4 объекта:

from multipledispatch import dispatch 

@dispatch(RS4) 
def eset_subset(eset, features=None, samples=None): 
    """ 
    subset an RS4 eset object 
    """ 
    features = features if features else eset.exprs.rownames 
    samples = samples if samples else eset.exprs.colnames 

    fx = robjects.BoolVector([f in features for f in eset.exprs.rownames]) 
    sx = robjects.BoolVector([s in samples for s in eset.exprs.colnames]) 

    esub=methods.selectMethod("[", signature="ExpressionSet")(eset, fx,sx) 
    return esub 
Смежные вопросы