for - ejecutar r desde python
Convertir objetos python para rpy2 (3)
Necesitas agregar
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Consulte http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html :
Esa importación por sí sola es suficiente para cambiar una conversión automática de objetos numpy en objetos rpy2.
¿Por qué hacer que esto sea una importación opcional, mientras que podría haberse incluido en la función py2ri () (como se hizo en el parche original enviado para esa función)?
Aunque ambas son opciones válidas y razonables, la decisión de diseño se tomó para desacoplar a rpy2 del número y no se supone que tener el número instalado automáticamente significaba que el programador quería usarlo.
edición: con la serie rpy2 2.2.x, la importación por sí sola ya no es suficiente. La conversión debe ser activada explícitamente.
Se supone que el siguiente código crea un mapa de calor en rpy2
import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)
Sin embargo, se traduce en el siguiente error
Traceback (most recent call last):
File "z.py", line 8, in <module>
labRow=rowNames, labCol=colNames)
File "C:/Python25/lib/site-packages/rpy2/robjects/__init__.py", line 418, in __call__
new_args = [conversion.py2ri(a) for a in args]
File "C:/Python25/lib/site-packages/rpy2/robjects/__init__.py", line 93, in default_py2ri
raise(ValueError("Nothing can be done for the type %s at the moment." %(type(o))))
ValueError: Nothing can be done for the type <type ''numpy.ndarray''> at the moment.
De la documentación aprendí que r.heatmap espera "una matriz numérica". ¿Cómo convierto np.array al tipo de datos requerido?
Para mí (2.2.1) lo siguiente también funcionó (como se documenta en http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html ):
import rpy2.robjects as ro
from rpy2.robjects.numpy2ri import numpy2ri
ro.conversion.py2ri = numpy2ri
Para rpy2 2.2.4 tuve que añadir:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()