2010-01-23 12 views
9

estoy empezando a aprender a utilizar rpy2 con Python. Soy capaz de hacer tramas simples y cosas así, pero me he encontrado con el problema de que muchas opciones en R usan "." Por ejemplo, aquí es una llamada R que funciona:Python y Rpy2: función de diagrama de llamadas con opciones que tienen "." en ellos

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

donde t es una matriz.

Quiero usar la misma llamada en Python, pero rechaza el "" parte de names.arg. Según entendí, en Python reemplazas el "." con "_", por ejemplo names_arg por ejemplo, pero eso tampoco funciona. Sé que este es un problema básico, así que espero que alguien haya visto esto y conozca la solución. ¡Gracias!

Respuesta

8

Puede utilizar un diccionario aquí por los argumentos con nombre (using **) como described en la documentación, y llamar a R directamente para las funciones. También recuerde que RPy2 espera su own vector objects. Sí, es un poco incómodo, pero en el lado positivo, que debe ser capaz de hacer cualquier cosa en rpy2 que podría hacer en R.

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

(Tenga en cuenta que esto es para la versión 2.0.x rpy2; hay algunos . cambios en el unreleased 2.1 que no he tenido la oportunidad de mirar todavía)

+0

Esto funciona como un encanto, ¡gracias! –

1

No sé si RPY aceptará esto, pero se puede tener parámetros de palabras clave con períodos en los mismos. Sin embargo, debes pasarlos a través de un diccionario. De esta manera:

>>> 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

Esto es muy útil, especialmente combinado con respuesta 2. Todo fijo ahora, gracias! –

+0

En ese caso, debe marcar esta u otra respuesta como aceptada. –

0

con rpy2-2.1.0, una manera de escribir sería:

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"))) 

tener que utilizar barplot_default (en vez ese diagrama de barras) se debe al uso extensivo de de las elipsis '...' en las firmas de función R y d al hecho de que salvar traducción de nombres de parámetros requeriría análisis del código R contiene una función.

más, y un ejemplo de una función para realizar la traducción sistemática de ''. a '_' se encuentra en: http://rpy.sourceforge.net/rpy2/doc-2.1/html/robjects.html#functions

Cuestiones relacionadas