【问题标题】:rpy2: How to return vector to R from Python callback function?rpy2:如何从 Python 回调函数将向量返回到 R?
【发布时间】:2019-04-19 17:13:26
【问题描述】:

我正在尝试从 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】:

    这个问题也可以简单地重现:

    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 的错误修复版本通常会在周末发布。

    【讨论】:

    • 谢谢!我将在星期一检查错误修复版本。
    • 刚刚升级到 3.0.2,问题似乎消失了。谢谢!
    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    相关资源
    最近更新 更多