Convertendo objetos Python para RPY2
Pergunta
O código a seguir deve criar um mapa de calor no RPY2
import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)
No entanto, resulta no seguinte erro
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.
Com a documentação, aprendi que a R.Heatmap espera "uma matriz numérica". Como convertido np.array para o tipo de dados necessário?
Solução
Você precisa adicionar
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Ver http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html:
Essa importação por si só é suficiente para alternar uma conversão automática de objetos Numpy em objetos RPY2.
Por que tornar isso uma importação opcional, embora pudesse ter sido incluída na função py2ri () (como feito no patch original enviado para essa função)?
Embora ambos sejam opções válidas e razoáveis, a decisão de design foi tomada para dissipar o RPY2 da Numpy mais e não assumirá que ter o Numpy instalado automaticamente significava que um programador queria usá -lo.
editar:Com a série RPY2 2.2.x, a importação por si só não é mais suficiente. A conversão precisa ser explicitamente ativada.
Outras dicas
Para RPY2 2.2.4 Eu tive que acrescentar:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Para mim (2.2.1) o seguinte também funcionou (conforme documentado em 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