2009-10-30 6 views
2

Après avoir installé RPy2 deproblème étrange avec RPy2

http://rpy.sourceforge.net/rpy2.html

Je suis en train de l'utiliser en Python 2.6 IDLE mais je reçois cette erreur:

>>> import rpy2.robjects as robjects 
>>> robjects.r['pi'] 

<RVector - Python:0x0121D8F0/R:0x022A1760> 

Ce que je suis mal faire?

+0

Je suis utilisateur R 2.9.1 – jrara

+0

Je n'utilise pas IDLE mais si c'était directement dans l'interpréteur, vous ne feriez rien de mal (où est l'exception?). Qu'est-ce que vous attendiez? – kaleissin

+1

(1) Ne commentez pas vos propres questions. Mettez à jour votre question pour inclure les faits "R 2.9.1". (2) qu'est-ce qui vous fait penser que c'est une "erreur"? Cela ressemble à un objet RVector. –

Répondre

7

Avez-vous essayé de regarder le vecteur qui est retourné?

>>> pi = robjects.r['pi'] 
>>> pi[0] 
3.14159265358979 
1

Dans l'interpréteur interactif Python, si une expression renvoie une valeur, cette valeur est automatiquement imprimée. Par exemple, si vous créez un dictionnaire et en extrayez une valeur, la valeur est automatiquement imprimée, mais si cela se trouvait dans un script en cours d'exécution, ce ne serait pas le cas. Regardez l'exemple simple suivant ce n'est pas une erreur mais simplement python imprimer le résultat de l'expression:

>>> mymap = {"a":23} 
>>> mymap["a"] 
23 

Le même code dans un script python produirait pas de sortie du tout.

Dans votre code, vous accédez à une carte comme la structure avec le code:

>>> robjects.r['pi']

C'est de retour un objet R2Py pour lequel la représentation de chaîne par défaut est: <RVector - Python:0x0121D8F0/R:0x022A1760>

Si vous avez modifié le Code à quelque chose comme:

pi = robjects.r['pi']

vous ne verriez pas de sortie mais le résultat de l'appel (un vecteur) sera affecté à la variable pi et sera disponible pour vous d'utiliser.

En regardant le R2Py documentation Il semble que la plupart des objets sont imprimés par défaut en tant que type dans <> parenthèses et certaines informations d'adresse de mémoire.

5

Pour développer la réponse de Shane. rpy2 utilise les objets python suivants pour représenter les types de R de base:

  • RVector: R scalaires et des vecteurs, R listes sont représentés comme RVectors avec des noms, voir ci-dessous
  • rtableau: une matrice R, essentiellement le RVector avec une dimension
  • RDataFrame: un R data.frame

pour contraindre revenir à des types Python de base look here.

À titre d'exemple, je l'utiliser pour convertir une liste de R à un dict python:

rList = ro.r('''list(name1=1,name2=c(1,2,3))''') 
pyDict = {} 
for name,value in zip([i for i in rList.getnames()],[i for i in rList]): 
    if len(value) == 1: pyDict[name] = value[0] 
    else: pyDict[name] = [i for i in value] 
1

Ce n'est pas une erreur, il est tout simplement le « rééd » du robject retourné:

>>> r['pi'] 
<RVector - Python:0x2c14bd8/R:0x3719538> 
>>> repr(r['pi']) 
'<RVector - Python:0x4b77908/R:0x3719538>' 
>>> str(r['pi']) 
'[1] 3.141593' 
>>> print r['pi'] 
[1] 3.141593 

Vous pouvez obtenir la valeur de « pi » accès par index

>>> r['pi'][0] 
3.1415926535897931 

Pour accéder à l'élément de listes nommées (le objet attribut $ 'syntax R) J'utilise

>>> l = r.list(a=r.c(1,2,3), b=r.c(4,5,6)) 
>>> print l 
$a 
[1] 1 2 3 

$b 
[1] 4 5 6 

>>> print dict(zip(l.names, l))['a'] 
[1] 1 2 3 

mais je pense qu'il doit y avoir une meilleure solution ...

0

Je trouve cela comme la seule raisonnable, brève discussion sur la façon de revenir en arrière et à partir de R objets et python. La solution de naufraghi a incité l'approche suivante pour la conversion d'un data.frame, qui conserve les capacités de découpage plus agréable du dataframe:

In [69]: import numpy as np 

In [70]: import rpy2.robjects as ro 

In [71]: df = ro.r['data.frame'](a=r.c(1,2,3), b=r.c(4.0,5.0,6.3)) 

In [72]: df 
Out[72]: <RDataFrame - Python:0x5492200/R:0x4d00a28> 

In [73]: print(df) 
    a b 
1 1 4.0 
2 2 5.0 
3 3 6.3 

In [74]: recdf = np.rec.fromarrays(df, names=tuple(df.names)) 

In [75]: recdf 
Out[75]: 
rec.array([(1, 4.0), (2, 5.0), (3, 6.2999999999999998)], 
     dtype=[('a', '<i4'), ('b', '<f8')]) 

semble un peu hors-sujet à ce moment, mais je ne suis pas sûr de ce que la procédure appropriée serait de saisir cette question & réponse de la mienne!

+0

Joli usage de fromarrays(). Cela fera partie du module de conversion automagic rpy/numpy. – lgautier