我正在尝试从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
在此先感谢任何可以弄清我在做什么的人。
答案 0 :(得分: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的错误修复版本通常会在周末发布。