【问题标题】:Converting a script from rpy to rpy2 using rpy2.rpy_classic使用 rpy2.rpy_classic 将脚本从 rpy 转换为 rpy2
【发布时间】:2015-12-09 19:40:14
【问题描述】:

对于python,我有点新手,但我想将使用rpy 的python 脚本转换为使用rpy2 的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(&lt;expression)$o 值)

我在正确的轨道上前进吗?以及如何重写 rpy (v1) 代码以便得到我想要的(来自 rpy2)?

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

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

    【讨论】:

    • 我需要添加 import rpy2.robjects.numpy2ri rpy2.robjects.numpy2ri.activate() 因为我正在传递一个 numpy 对象,但这确实有效
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 2019-09-02
    • 2012-06-02
    • 2012-05-26
    • 2014-08-24
    • 2011-02-09
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多