2010-01-23 8 views
9

Sto appena iniziando a imparare come usare rpy2 con python. Sono in grado di realizzare semplici trame e simili, ma ho riscontrato il problema che molte opzioni in R usano ".". Ad esempio, ecco una chiamata R che funziona:Python e Rpy2: chiamata funzione di stampa con opzioni che hanno "." in loro

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

dove t è una matrice.

Voglio usare la stessa chiamata in python, ma rifiuta il "." parte di names.arg. La mia comprensione era che in pitone si sostituisce il "." con "_", quindi nomi_arga, ad esempio, ma non funziona neanche. So che questo è un problema di base quindi spero che qualcuno abbia visto questo e conosca la soluzione. Grazie!

risposta

8

È possibile utilizzare un dizionario qui per gli argomenti con nome (using **) come described nella documentazione, e chiamare R direttamente per le funzioni. Ricorda inoltre che RPy2 si aspetta il suo own vector objects. Sì, è un po 'imbarazzante, ma il lato positivo, si dovrebbe essere in grado di fare nulla in rpy2 si potrebbe fare in R.

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

(Si noti che questo è per la versione 2.0.x rpy2; ci sono alcuni . cambiamenti nella unreleased 2.1 che non ho avuto la possibilità di guardare ancora)

+0

Funziona come un incantesimo - grazie! –

1

Non so se Rpy accetterà ciò, ma è possibile avere parametri di parole chiave con periodi al loro interno. Devi passare attraverso un dizionario però. Come questo:

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

Questo è veramente utile, specialmente combinato con la risposta 2. Tutto risolto ora, grazie! –

+0

In tal caso, contrassegnare questa o l'altra risposta come accettata. –

0

Con rpy2-2.1.0, un modo di scrivere che sarebbe stato:

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

dover utilizzare barplot_default (piuttosto quel barplot) è dovuto all'utilizzo estensivo dei puntini di sospensione "..." nelle firme di R e d al fatto che salvare la conversione del nome parametro richiederebbe l'analisi del codice R di una funzione.

Altro e un esempio di una funzione per eseguire la traduzione sistematica di "." a '_' è a: http://rpy.sourceforge.net/rpy2/doc-2.1/html/robjects.html#functions

Problemi correlati