【问题标题】:Error using number as argument to R function in RPy2在 RPy2 中使用数字作为 R 函数的参数时出错
【发布时间】:2018-06-14 11:04:35
【问题描述】:

我正在尝试在时间序列上使用 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 也是一个整数并且处理得很好。

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

【问题讨论】:

  • 请修正代码中的缩进。
  • emi = numpy.array(tseriesChaos.mutual(tseries, bins, z, plot)) 出现错误,但您提供的有关tseriesChaos.mutual() 的信息很少。您是否查看了文档:rpy2.github.io/doc/v2.9.x/html/…

标签: python r python-3.x numpy rpy2


【解决方案1】:

事实证明,问题的出现是因为我在程序的早期错误地激活了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())tseriesnumpy 数组直接转换为R 向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多