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.

  • Plotten von 3-Tupel-Datenpunkten in einem Oberflächen- / Kontur-Plot mit matplotlib
  • Passliste von python zu R bis rpy2
  • Python-Schnittstelle für R Programmiersprache
  • Kann ich während des Setups einen externen (R) Prozess an jeden pyspark Arbeiter anschließen
  • Statistik-Tests (Kolmogorov und T-Test) mit Python und Rpy2
  • Aufruf von benutzerdefinierten Funktionen von Python mit rpy2
  • Rpy2 importiere externe R-Datei
  • Rpy2 kann das 'rgl' R-Paket nicht importieren
  • Rpy2-Fehler wac-a-mol: R_USER nicht definiert
  • Migration einer logistischen Regression von R nach rpy2
  • Ausrichtung unterschiedlicher Nicht-Facetten-Plots in ggplot2 mit Rpy2 in Python
  • Python ist die beste Programmiersprache der Welt.