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

Converting a script from rpy to rpy2 using rpy2.rpy_classic

我对 python 有点新手,但我想将使用 rpy 的 python 脚本转换为使用 rpy2 的脚本。我们确实在某处安装了 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)?

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