rpy2:如何从Python回调函数向R返回向量?

问题描述 投票:0回答:1

我正在尝试从Python调用R包中的函数。 R函数需要一个回调函数,它接受一个值向量,进行一些计算,并返回一个结果向量。

我能够得到一个回调工作,但只有它返回一个标量。所有返回多个值的尝试都会导致rpy2抛出一个ValueError。

从rpy2.robject,我尝试了FloatVectors和IntVectors。我也尝试将我的Python列表转换为numpy数组或pandas数据帧,然后使用rpy2的接口来转换它们。没有工作。

为了清楚起见,我能够成功地使用所有这些方法来创建我可以从Python传递到R函数的参数列表的对象。当我试图从Python回调中返回一个向量时,我只得到错误。

我把这个问题简化为一个简单的测试。这是接受然后调用回调函数的R代码:

Test <-
function(cb) {
    cb()
}

而且,这是我用来调用R代码的Python代码:

import rpy2.rinterface as ri
from rpy2 import robjects

robjects.r('source("Test.R")')
test = robjects.r['Test']

@ri.rternalize
def cb_test():

    return robjects.FloatVector([1.0, 2.0, 3.0])

test(cb_test)

预期结果:

FloatVector with 3 elements.
1.000000    2.000000    3.000000

实际结果:

<class 'ValueError'>: [1] 1 2 3

提前感谢能够弄清楚我做错了什么的人。

rpy2
1个回答
0
投票

这个问题也可以简单地复制:

import rpy2.rinterface as ri
ri.initr()

@ri.rternalize
def cb_test():
    return ri.FloatSexpVector([1.0, 2.0, 3.0])

cb_test()

这似乎是一个问题,现在在这里跟踪:https://bitbucket.org/rpy2/rpy2/issues/538/

编辑:代码回购中有一个初始修复,rpy2的错误修复版本通常会在周末发布。

© www.soinside.com 2019 - 2024. All rights reserved.