使用rpy2.rpy_classic将脚本从rpy转换为rpy2

时间:2015-12-09 19:40:15

标签: python r rpy2

对于python我是一个新手,但我想使用rpy将使用rpy的python脚本转换为一个。我们确实在某处安装了rpy(对于python 2.6.x),但它与当前版本的R(3.2.0)不能很好地兼容。但是我们为这些脚本中使用的python版本安装了rpy2(python 2.7 [.5])

据我所知,这些是需要改变的行(我简化了一点功能):

from rpy import r

r.library('<libname>', quietly=True)
r("""\
func <- function(x,a={options.a},b={options.b})  {{
... 
*R code here* 
...
l<-list(o=o,md=a+b) 
l
}}""".format(options=options))

以及稍后的脚本中,有一行调用此函数:

out = r.func(<python expression>)['o']

我可以按照以下方式完成上半部分:

import rpy2.rpy_classic as rpy

rpy.set_default_mode(rpy.NO_CONVERSION)

rpy.r.library('<libname>', quietly=True)
rpy.r("""\
func <- function(x,a={options.a},b={options.b})  {{
... 
*R code here* 
...
l<-list(o=o,md=a+b) 
l
}}""".format(options=options))

在交互式提示中尝试上述内容(包含一些虚假数据),输出为:

<rpy2.rpy_classic.Robj object at 0x2b9e48481510>

但我需要函数rpy.r.func的输出值而不是未转换的值(因为我需要获取func(<expression)$o值)

我是否正在走上正轨?我如何重写rpy(v1)代码以便得到我想要的东西(来自rpy2)?

1 个答案:

答案 0 :(得分:0)

rpy_classic在早期主要用于证明rpy2中的低级接口可用于实现任何更高级别的接口,包括rpy中的接口。它并不意味着是一个终极兼容工具。

使用rpy2的高级接口robjects,您的rpy代码如下所示:

from rpy2.robjects.packages import importr
from rpy2.robjects import r

lib=importr('<libname>')
rfunc=r("""
  function(x,a={options.a},b={options.b})  {{
    ... 
    *R code here* 
    ...
    l<-list(o=o,md=a+b) 
    l
  }}""".format(options=options))

out = rfunc(<python expression>).rx2('o')