2016-04-11 6 views
0

Ich versuche rpy2 zu verwenden, um die multi.split Funktion aus dem questionr Paket auszuführen.Fehler bei der R-Funktion mit rpy2 läuft

dies ist mein Code

from rpy2 import robjects 
from rpy2.robjects.packages import importr 

questionr = importr(str('questionr')) 

data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green"] 
data_vector = robjects.StrVector(data) 
multi_split = questionr.multi_split 
data_table = multi_split(data_vector, split_char='/') 

nach der letzten Zeile ich folgende Fehlermeldung bin immer:

RRuntimeError: Error in `colnames<-`(`*tmp*`, value = c("c(\"red/blue\",_\"green\",_\"red/green\",_\"blue/red\",_\"red/blue\",_\"green\",_.blue", : 
'names' attribute [4] must be the same length as the vector [3] 

Ich denke, dass es etwas mit der Größe des Vektors zu tun, dass ich ist zu senden, denn wenn ich das letzte Element

data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue"] 

und führen Sie dann entfernen

data_vector = robjects.StrVector(data) 
multi_split = questionr.multi_split 
data_table = multi_split(data_vector, split_char='/') 

Ich erhalte keine Fehlermeldung. auch wenn ich den „split_char‘ var, zum Beispiel zu ändern:.

data_table = multi_split(data_vector, split_char='.') 

ich keine Fehlermeldung erhalten, ganz gleich mit Größe eines Arrays bin das Senden mir

Ich habe versucht, den passenden Code auszuführen direkt in R (mit R-Studio) läuft es mit keinen Problemen. Alle Ideen, wie kann ich dieses Problem lösen?

Antwort

1

Dies scheint zu sein, da die Funktion multi_split (multi.split in dem R-Paket) versucht, das zu verwenden, Zeichenfolgendarstellung des Ausdrucks, der dem ersten Argument zugeordnet ist ("data_vector" hier)

Die Signatur der R-Funktion ist:

multi.split(var, split.char = "/", mnames = NULL) 

und die er Dokumentation für mnames ist:

names to give to the produced variabels. If NULL, the name are computed from the original variable name and the answers.

Im Aufruf multi_split(data_vector, split_char='/') die eingebettete R nicht die Variablennamen sehen, da dies eine ist Python-Aufruf und data_vector ist eine anonyme Variable (nur Inhalt, kein Variablenname).

ich, dass Sie zwar mnames angeben können, aber Sie überprüft, und diese Arbeit nicht (siehe Kommentar unten). Das scheint der Code zu sein: Die Zeile vname <- deparse(substitute(var)) wird ausgewertet, egal, ob mnames angegeben ist oder nicht: https://github.com/juba/questionr/blob/9cf09f3ffcd6c8df24182380f12d52b061c221ef/R/table.multi.R#L161

Die Alternative besteht darin, die Verwendung eines R-Ausdrucks auszuarbeiten. Ein älterer Post die notwendigen Bits dafür sorgen sollte: What object to pass to R from rpy2?

Eine dritte Möglichkeit ist kreativ Python-Strings-as-R-Code mischen:

data = ["red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green", "red/green", "blue/red", "red/blue", "green"] 
data_vector = robjects.StrVector(data) 
# binding the R vector to a symbol in R's "GlobalEnv" 
robjects.globalenv['mydata'] = data_vector 
# the call is now in a Python string that is evaluated as R code 
data_table = robjects.r("multi.split(data_vector, split_char='/')") 
+0

ich den 'mnames' Parameter hinzuzufügen versucht haben, wie Sie können hier sehen: 'data_table = multi_split (data_vector, split_char = '/', mnames = robjects.StrVector ([ 'a', 'b']))', aber ich bin immer noch die gleiche Fehlermeldung bekommen. –

+0

OK. Ich habe die Antwort aktualisiert. Hoffentlich ist eine der Optionen für Sie praktikabel. Immer wenn der R-Code den nicht bewerteten Ausdruck als Zeichenfolge verwendet, um Etiketten- oder Variablennamen zu erstellen, kann die Verwendung anonymer Objekte Probleme verursachen. – lgautier