2010-07-21 9 views
4

Je rencontre des problèmes pour comprendre le mappage avec l'objet rpy2 et l'objet python.Mappage du tuple python et de la liste R avec rpy2?

J'ai une fonction (x) qui retourne un objet tuple en python, et je veux mapper cet objet tuple avec R liste d'objets ou vecteur.

D'abord, je suis en train de le faire:

# return a python tuple into this r object tlist 
robjects.r.tlist = get_max_ticks(x) 

#Convert list into dataframe 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

FAIL avec l'erreur: rinterface.RRuntimeError: Erreur dans eval (expr, Envir, Enclos): objet 'tlist' not found

J'essaie une autre stratégie:

robjects.r["tlist"] = get_max_ticks(x) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

FAIL avec cette erreur: TypeError: l'objet 'R' ne prend pas en charge l'affectation d'élément

Pourriez-vous m'aider à comprendre? Merci beaucoup!

Répondre

3

Utilisation globalEnv:

import rpy2.robjects as ro 
r=ro.r 

def get_max_ticks(): 
    return (1,2) 
ro.globalEnv['tlist'] = ro.FloatVector(get_max_ticks()) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 
print(r['x']) 
#  tlist 
# seed  1 
# ticks  2 

Il est possible d'accéder à des symboles dans l'espace de noms R avec ce type de notation: robjects.r.tlist, mais vous ne pouvez pas attribuer des valeurs de cette façon. La façon d'attribuer un symbole est d'utiliser robject.globalEnv.

De plus, certains symboles dans R peuvent contenir une période, telle que data.frame. Vous ne pouvez pas accéder à ces symboles en Python en utilisant une notation similaire à robjects.r.data.frame, puisque Python interprète la période différemment que R. Donc, je suggère d'éviter cette notation entièrement, et utiliser plutôt robjects.r['data.frame'], puisque cette notation fonctionne quel que soit le nom du symbole.

+1

Cette notation n'est pas sûr non plus, comme faire quelque chose comme « ro.globalEnv [ 'data.frame'] = ro.r ('fonction (x) NULL ') "quelque part avant va causer des problèmes. Je recommande d'utiliser la classe DataFrame. – lgautier

+0

Thx @ ~ unutbu, thx @lgautier pour votre réponse ici et sur la liste de mailling, maintenant j'essaie de comprendre l'exemple avec l'objet data.frame dans le manuel – reyman64

0

Vous pouvez également éviter la cession en R tous ensemble:

import rpy2.robjects as ro 
tlist = ro.FloatVector((1,2)) 
keyWordArgs = {'row.names':ro.StrVector(("seed","ticks"))} 
x = ro.r['as.data.frame'](tlist,**keyWordArgs) 
ro.r['print'](x) 
Questions connexes