2016-08-08 19 views
0

Ich habe den folgenden Code in R:Annotation DB hat keine 'wählen' Methode in rpy2

require(hgu133a.db) 

entrezIDs <- select(hgu133a.db, probeNames, "ENTREZID") 

wo probeNames ist eine Liste von Strings an Sonden in dieser Datenbank enthalten entspricht.

Ich versuche, es zu Python zu übersetzen rpy2 mit:

from rpy2.robjects.packages import importr 
hgu133a_db = importr('hgu133a.db') 

entrez_ids = hgu133a_db.select(hgu133a_db, probe_names, 'ENTREZID') 

Aber erhalten Sie den Fehler:

AttributeError: module 'hgu133a.db' has no attribute 'select'

Ich habe die Dokumentation gesucht (?select) und soweit ich sagen kann, Die Datenbank hgu133a.db erbt eine select Methode aus der AnnotationDbi Klasse.

Wie löse ich die Bibliothek richtig auf, woher select() stammt, damit ich sie in Python verwenden kann?

Antwort

1

[sollte ein Kommentar zu @merv gewesen ‚s Antwort, aber die Anzahl Zeichen überschritten]

rpy2‘ s importr() versucht zu helfen ein Spezifikum darüber, aus welchem ​​Paketnamensraum ein R-Objekt kommt, während die übliche Verwendung von R viel weniger ist (und zu Störungen führen kann, wie die Ladereihenfolge von R-Paketen, die einen Einfluss darauf haben, welche der Funktionen mit dem gleichen Namen ist hingerichtet).

Der Kompromiss mit importr ist, dass man wissen muss, wo ein R-Symbol herkommt. Es gibt eine weniger bekannte Funktion in rpy2, die helfen kann zu finden, wo ein gegebenes R-Symbol definiert ist (*): https://rpy2.readthedocs.io/en/version_2.8.x/robjects_rpackages.html#finding-where-an-r-symbol-is-coming-from.

Andernfalls kann auch r() verwendet werden, um das Objekt abzurufen, das in einer R-Sitzung ausgewählt wurde (*).

from rpy2.robjects import r 
r('select') 

(*: Wie bereits erwähnt, ist die Reihenfolge, in der R Pakete wurden früher in der Sitzung geladen kann einen Einfluss haben, auf dem R-Objekt gerichtet).

+0

Mit 'select = r ('select')' nach dem Importieren der R-Bibliotheken funktioniert perfekt! Viel bessere Lösung als die abstrakte Basisklasse manuell ausfindig zu machen. – merv

+0

Kann nicht in jeder Situation besser sein. Es kann sicherlich bequemer sein, wenn Sie "nur ausführen wollen, was R laufen würde", aber die Verwendung von Namespaces, die von 'importr' erstellt wurden, kann hilfreich sein, robuster Code zu schreiben (indem Sie nicht zulassen, welche R-Pakete in R importiert wurden oder in welcher Reihenfolge sie waren, ändern möglicherweise die Funktion genannt). – lgautier

0

Anscheinend gibt es zwei Probleme mit dem oben genannten. Zuerst sollte AnnotationDbi verwendet werden, um die select() Methode zu lösen. Zweitens ist hgu133a_db ein InstallSTPackage Objekt - stattdessen muss hgu133a_db.hgu133a_db verwendet werden. Dass sie die Übersetzung von R zu Python zusammen ist:

from rpy2.robjects.packages import importr 

annotation_dbi = importr('AnnotationDbi') 
hgu133a_db = importr('hgu133a.db') 

entrez_ids = annotation_dbi.select(hgu133a_db.hgu133a_db, probe_names, 'ENTREZID')