Welches Ziel ist es, von Rpy2 zu übergehen?

Ich bin nicht in der Lage, den folgenden Code zu machen, aber ich sehe diesen Fehler nicht genau in 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))) 

Es ist besonders verwirrend, wenn man bedenkt, dass der folgende Code gut funktioniert

 forecast.auto_arima(y, xreg=X) 

Ich sehe die folgende Rückverfolgung egal was ich für X gebe, mit numpy Schnittstelle oder nicht. Irgendwelche Ideen?

 --------------------------------------------------------------------------- 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 

Bearbeiten :

Das Problem ist, dass die folgenden Codezeilen nicht zu einem Spaltennamen auswerten, was die Erwartung auf der R-Seite zu sein scheint.

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

Ich weiß nicht gut genug, was die Erwartungen dieses Codes in R sein sollten, aber ich kann kein RPy2-Objekt finden, das diesen Check übergibt, indem er etwas von der length == 1 zurückgibt length == 1 . Das sieht wirklich wie ein Bug für mich aus.

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

Aber in Rpy2

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

One Solution collect form web for “Welches Ziel ist es, von Rpy2 zu übergehen?”

Dies ist eine Manifestation (siehe diese andere verwandte Frage zum Beispiel) der gleichen zugrunde liegenden Frage: R-Ausdrücke werden faul ausgewertet und können innerhalb von R manipuliert werden und dies führt zu Idiomen, die sich nicht gut übersetzen (in Python-Expression werden sofort ausgewertet und eins Muss zum AST wechseln, um Code zu manipulieren).

Eine Antwort auf den zweiten Teil Ihrer Frage. In R, substitute(rep(.2, 1000)) übergibt der nicht bewertete Ausdruck rep(.2, 1000) um substitute() zu substitute() . In rpy2

 substitute('rep(.2, 1000)')` 

Übergibt einen String; Das R-Äquivalent wäre

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

Das Folgende lässt Sie nah an R's 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))" 

Derzeit ist eine Möglichkeit, darüber zu arbeiten, um R-Objekte an R-Symbole (vorzugsweise in einer dedizierten Umgebung anstatt in GlobalEnv) zu binden und die Symbole in einem R-Aufruf als String zu verwenden:

 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) 

Das ist nicht so etwas wie eine Lösung, aber ich habe noch nie die Zeit gefunden, an einer besseren Lösung zu arbeiten.

Edit: Mit rpy2-2.4.0 wird es möglich, R-Symbole zu verwenden und folgendes auszuführen:

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

Das ist noch nicht die intuitivste Schnittstelle. Vielleicht wäre etwas mit einem Kontext-Manager wäre besser.

  • So erstellen Sie einen leeren R-Vektor, um neue Elemente hinzuzufügen
  • Statistik-Tests (Kolmogorov und T-Test) mit Python und Rpy2
  • Übersetzer benannte Listenvektoren von R in rpy2 in Python?
  • Aufspalten und Verketten von Dataframes in Python-Pandas für das Plotten mit rpy2
  • Python rpy2 und quantmod Beispiele
  • Rpy2 Fehler: "unerkanntes Escape in Zeichenfolge"
  • Probleme bei der Installation von rpy2 auf win7 (R 2.12, Python 2.5)
  • Bizzarre Problem versucht, Rpy2 2.1.9 Arbeit mit R 2.12.1, mit Python 2.6 unter Windows XP - Rpy kann nicht finden, die R.dll?
  • Referenzpaket in der persönlichen Bibliothek von rpy2
  • Rpy2, R und Ubuntu 12.04 - Ungültige substring -fopenmp
  • Unterschied in Python statsmodels OLS und R's lm
  • Python ist die beste Programmiersprache der Welt.