rpy2 2.2.2中numpy2ri转换问题

1 投票
1 回答
1840 浏览
提问于 2025-04-16 22:19

我正在使用 rpy2-2.2.2 版本,配合新的免费的 Enthought Python 发行版,这个版本里包含了 numpy 1.6.0 和 Python 2.7.2。我通过 easy_install 安装了 rpy2,结果安装了 2.2.2 版本,所有测试都通过了。

我遇到的问题是,我之前写的代码在 rpy2 2.1.8 和 Python 2.6 下运行得很好。现在的问题出在将 numpy 数组转换为 R 数组上。

以下是相关代码的一部分:

import rpy2                    
import rpy2.rinterface as rinterface
import rpy2.robjects as rob    
import rpy2.rlike.container as rlc
import numpy as np            
import rpy2.robjects.numpy2ri  
r = rob.r
...
    HGr     = rob.conversion.py2ri(HG_reg)
    RHSr    = rob.conversion.py2ri(RHS)
    #
    CalData = rlc.TaggedList([HGr,RHSr],tags=('hg','rhs'))
    CalData = rob.DataFrame(CalData)

    r('''library(pls)''')
    #rob.globalEnv["HGr"] = HGr
    #rob.globalEnv["RHSr"] = RHSr
    rob.globalenv["CalData"] = CalData


    # perform the PLS regression
    if wetlflag:
        HGresults = r.plsr(r("hg ~ rhs.1 + rhs.2 + rhs.3 + rhs.4"),data=CalData,validation="LOO")

我承认这不是最优雅的做法,但之前是可以用的,现在我需要提供结果时却全都坏掉了(!)。我收到的错误信息是:

   Traceback (most recent call last):
  File "Mercury_PLS_WL_DF.py", line 224, in <module>
    HGr     = rob.conversion.py2ri(HG_reg)
  File "/Library/Frameworks/Python.framework/Versions/7.1/lib/python2.7/site-packages/rpy2-2.2.2dev_20110726-py2.7-macosx-10.5-i386.egg/rpy2/robjects/__init__.py", line 134, 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.

我在 这里 找到了相关讨论,感觉 numpy 数组现在应该会自动转换为 R 数组,但如果我注释掉 rob.conversion.py2ri(HG_reg) 这行代码,直接使用 numpy 数组似乎也不行。我是不是漏掉了什么明显的东西?为什么在 2.1.8 和 2.2.2 之间会出现这种问题?

1 个回答

3

来自 http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html#from-numpy-to-rpy2:

警告

在早期版本的 rpy2 中,导入模块就可以完成转换。但现在,导入模块可能会带来一些问题,所以需要多一步操作才能让转换生效:调用函数 rpy2.robjects.activate()

所以在导入之后加上 rpy2.robjects.activate(),这样就没问题了。

撰写回答