在 RPy2 中使用数字作为 R 函数的参数时出错

Error using number as argument to R function in RPy2

我正在尝试在时间序列上使用 R 包 tseriesChaos 中的互信息函数并找到第一个最小值以确定时间序列延迟嵌入的最佳延迟。我编写了以下函数来完成此操作:

def determine_lag(tseries, plot):
numpser = numpy.asarray(tseries)
n = numpser.size
bins = 1 + math.log(n, 2)
z = 500 
emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot))
x = emi[0]
it = numpy.nditer(emi)
while not it.finished:
    y = it[0]
    num = it.index
    if y > x:
        lag = num
        break
    else:
        x = y
    it.iternext()
else:
    showwarning(title='Error', message='No minimum found, delay set to 50')
    failed = True
    lag = 50
return lag, failed

其中 tseries 是由 soundfile.read 在其他地方提取的时间序列,plotTRUEFALSE

但是,当尝试使用该函数时,R 函数的参数转换似乎出现了错误。输出结果如下:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.4/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
return self.func(*args)
File "/Users/BrandonPlay/Soundbed 0.3/master.py", line 177, in Start
self.lag, failed = determine_lag(self.tseries, do_plot)
File "/Users/BrandonPlay/Soundbed 0.3/master.py", line 49, in determine_lag
emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot))
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 178, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 102, in __call__
new_args = [conversion.py2ri(a) for a in args]
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/functions.py", line 102, in <listcomp>
new_args = [conversion.py2ri(a) for a in args]
File "/Users/BrandonPlay/Library/Python/3.6/lib/python/site-packages/rpy2/robjects/numpy2ri.py", line 72, in numpy2ri
if not o.dtype.isnative:
AttributeError: 'float' object has no attribute 'dtype'

据我所知,当 RPy2 中将参数转换为 R 对象以传递给 R 函数的函数遇到参数 z 时,就会发生此错误。当前的设置,其中 z 在函数调用之外分配,试图修复错误;之前,我只是简单地将数字声明为函数调用中的参数。

我什至不明白为什么参数转换器在处理简单的整数参数时会遇到困难,尤其是因为 bins 也是一个整数并且处理得很好。

有人知道为什么会这样吗?

事实证明,问题的发生是因为我在程序的早期错误地激活了 numpy2ri,将其分配给 py2ri 而不是使用 numpy2ri.activate(),从而覆盖了正常py2ri 将非 numpy 对象转换为 r 对象的例程。我在尝试通过将所有内容都转换为 numpy 对象(包括对简单整数参数使用 numpy.array([numpy.int_(some_number)]) )来修复大量类似错误时发现了这一点。奇怪的是,numpy2ri.activate() 从来没有工作过,而是给出了类似 class function has no method activate 的错误,这很奇怪,因为文档就是这样告诉你这样做的。最后,我完全删除了 numpy2ri,只是预先使用 tmseries = robjects.FloatVector(tseries.tolist())tseries numpy 数组直接转换为 R 向量。