gpt4 book ai didi

python - 从 rpy2 传递给 R 的对象是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:11 24 4
gpt4 key购买 nike

我无法使以下代码正常工作,但我没有看到此错误在 R 中严格起作用。

from rpy2.robjects.packages import importr
from rpy2 import robjects
import numpy as np

forecast = importr('forecast')
ts = robjects.r['ts']

y = np.random.randn(50)
X = np.random.randn(50)

y = ts(robjects.FloatVector(y), start=robjects.IntVector((2004, 1)), frequency=12)
X = ts(robjects.FloatVector(X), start=robjects.IntVector((2004, 1)), frequency=12)

forecast.Arima(y, xreg=X, order=robjects.IntVector((1, 0, 0)))

考虑到以下代码工作正常,这尤其令人困惑

forecast.auto_arima(y, xreg=X)

无论我为 X 提供什么,无论是否使用 numpy 接口(interface),我都会看到以下回溯。有什么想法吗?

---------------------------------------------------------------------------
RRuntimeError Traceback (most recent call last)
<ipython-input-20-b781220efb93> in <module>()
13 X = ts(robjects.FloatVector(X), start=robjects.IntVector((2004, 1)), frequency=12)
14
---> 15 forecast.Arima(y, xreg=X, order=robjects.IntVector((1, 0, 0)))

/home/skipper/.local/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
84 v = kwargs.pop(k)
85 kwargs[r_k] = v
---> 86 return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)

/home/skipper/.local/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
33 for k, v in kwargs.iteritems():
34 new_kwargs[k] = conversion.py2ri(v)
---> 35 res = super(Function, self).__call__(*new_args, **new_kwargs)
36 res = conversion.ri2py(res)
37 return res

RRuntimeError: Error in `colnames<-`(`*tmp*`, value = if (ncol(xreg) == 1) nmxreg else paste(nmxreg, :
length of 'dimnames' [2] not equal to array extent

编辑:

问题是下面的代码行没有计算出列名,这似乎是 R 端的期望。

sub = robjects.r['substitute']
deparse = robjects.r['deparse']
deparse(sub(X))

我不太清楚这段代码在 R 中的期望是什么,但我找不到通过返回 length == 1 的内容来通过此检查的 RPy2 对象。在我看来,这真的像是一个错误。

R> length(deparse(substitute((rep(.2, 1000)))))
[1] 1

但是在 Rpy2 中

[~/]
[94]: robjects.r.length(robjects.r.deparse(robjects.r.substitute(robjects.r('rep(.2, 1000)'))))
[94]:
<IntVector - Python:0x7ce1560 / R:0x80adc28>
[ 78]

最佳答案

这是同一潜在问题的一种表现形式(例如参见 other related issue):R 表达式被延迟求值并且可以在 R 中被操作,这导致习语翻译不好(在 Python 中表达式被立即求值,并且必须转移到 AST 来操作代码)。

问题第二部分的答案。在 R 中,substitute(rep(.2, 1000)) 将未计算的表达式 rep(.2, 1000) 传递给 substitute() .在 rpy2

中执行
substitute('rep(.2, 1000)')`

正在传递一个字符串; R 等价物是

substitute("rep(.2, 1000)")

以下是让您接近 R 的 deparse(substitute()):

from rpy2.robjects.packages import importr
base = importr('base')
from rpy2 import rinterface

# expression
e = rinterface.parse('rep(.2, 1000)')
dse = base.deparse(base.substitute(e))

>>> len(dse)
1
>>> print(dse) # not identical to R
"expression(rep(0.2, 1000))"

目前,解决此问题的一种方法是将 R 对象绑定(bind)到 R 符号(最好在专用环境中而不是在 GlobalEnv 中),并使用R 调用中的符号写成字符串:

from rpy2.robjects import Environment, reval

env = Environment()
for k,v in (('y', y), ('xreg', X), ('order', robjects.IntVector((1, 0, 0)))):
env[k] = v

# make an expression
expr = rinterface.parse("forecast.Arima(y, xreg=X, order=order)")
# evaluate in the environment
res = reval(expr, envir=env)

作为解决方案,我并不高兴,但我一直没有时间研究更好的解决方案。

编辑:使用 rpy2-2.4.0 可以使用 R 符号并执行以下操作:

RSymbol = robjects.rinterface.SexpSymbol
pairlist = (('x', RSymbol('y')),
('xreg', RSymbol('xreg')),
('order', RSymbol('order')))
res = forecast.Arima.rcall(pairlist,
env)

这还不是最直观的界面。可能使用上下文管理器会更好。

关于python - 从 rpy2 传递给 R 的对象是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23183853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com