2010-01-23 6 views
9

Je commence juste à apprendre à utiliser rpy2 avec python. Je suis capable de faire des complots simples et autres, mais j'ai rencontré le problème que beaucoup d'options dans R utilisent ".". Par exemple, voici un appel R qui fonctionne:Python et Rpy2: Fonction de tracé appelant avec les options qui ont "." en eux

barplot (t, col = heat.colors (2), names.arg = c ("pwn", "pwn2"))

où t est une matrice.

Je veux utiliser le même appel en python, mais il rejette le "." une partie de names.arg. Ma compréhension était que, en python, vous remplacez le "." avec "_", donc names_arg par exemple, mais ça ne marche pas non plus. Je sais que c'est un problème de base donc j'espère que quelqu'un a vu cela et connaît la solution. Merci!

Répondre

8

Vous pouvez utiliser un dictionnaire ici pour les arguments nommés (using **) comme described dans les documents, et appeler R directement pour les fonctions. Rappelez-vous aussi que RPy2 attend son own vector objects. Oui, il est un peu maladroit, mais sur le côté positif, vous devriez être en mesure de faire quoi que ce soit à rpy2 que vous pourriez faire dans R.

from rpy2 import robjects 
color = robjects.r("heat.colors")() 
names = robjects.StrVector(("pwn", "pwn2")) 
robjects.r.barplot(t, col=color, **{"names.arg":names}) 

(Notez que ceci est pour la version 2.0.x rpy2, il y a quelques . changements dans la unreleased 2.1 que je ne l'ai pas eu la chance de regarder encore)

+0

Cela fonctionne comme un charme - merci! –

1

Je ne sais pas si Rpy acceptera cela, mais vous pouvez avoir des paramètres de mot-clé avec des points dedans. Vous devez les passer à travers un dictionnaire si. Comme ceci:

>>> def f(**kwds): print kwds 
... 
>>> f(a=5, b_c=6) 
{'a': 5, 'b_c': 6} 
>>> f(a=5, b.c=6) 
Traceback ( File "<interactive input>", line 1 
SyntaxError: keyword cant be an expression (<interactive input>, line 1) 
>>> f(**{'a': 5, 'b.c': 6}) 
{'a': 5, 'b.c': 6} 
+0

Ceci est vraiment utile, surtout combiné avec la réponse 2. Tout est maintenant fixé, merci! –

+0

Dans ce cas, vous devez marquer cette réponse ou l'autre comme acceptée. –

0

Avec rpy2-2.1.0, une façon d'écrire serait:

from rpy2.robjects.packages import importr 
graphics = importr("graphics") 
grdevices = importr("grDevices") 

graphics.barplot_default(t, 
         col = grdevices.heat_colors(2), 
         names_arg = StrVector(("pwn", "pwn2"))) 

avoir à utiliser barplot_default (plutôt ce barplot) est dû à l'utilisation extensive de l'ellipse «...» dans les signatures de d au fait que la sauvegarde du nom du paramètre de sauvegarde nécessiterait l'analyse du code R qu'une fonction contient.

Plus, et un exemple d'une fonction pour effectuer la traduction systématique de '.' à '_' est à: http://rpy.sourceforge.net/rpy2/doc-2.1/html/robjects.html#functions

Questions connexes