Es ist einfacher, ein Problem mit einem vollständig funktionierenden Beispiel zu identifizieren. Ohne es wäre ich versucht zu sagen, dass es wie erwartet funktioniert.
In [1]: import rpy2.robjects as ro
In [2]: ro.vectors.FloatVector((1,2,3,4,5))
Out[2]:
<FloatVector - Python:0x7f3541c68788/R:0x3541468>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]
In [3]: ro.vectors.FloatVector(('1','2','3','4','5'))
Out[3]:
<FloatVector - Python:0x7f353bff7d88/R:0x3541398>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]
In [4]: ro.vectors.FloatVector(('1','2','3','a','5'))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-263bdc61f184> in <module>()
----> 1 ro.vectors.FloatVector(('1','2','3','a','5'))
/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj)
454
455 def __init__(self, obj):
--> 456 obj = FloatSexpVector(obj)
457 super(FloatVector, self).__init__(obj)
458
ValueError: Error while trying to convert element 3 to a double.
In [5]: ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5')))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-26578834d7ec> in <module>()
----> 1 ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5')))
/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj)
454
455 def __init__(self, obj):
--> 456 obj = FloatSexpVector(obj)
457 super(FloatVector, self).__init__(obj)
458
ValueError: Invalid SEXP type '16' (should be 14).
Nachdem festgestellt wurde, dass wir R können Vektoren von float von Python bauen, wir, ob eine Bindung es zu einem Symbol in R schauen kann und den Zugriff auf das Objekt aus R einen Unterschied macht. Es tut nicht:
In [1]: import rpy2.robjects as ro
In [2]: v = ro.vectors.FloatVector((1,2,3,4,5))
In [3]: ro.globalenv['v'] = v
In [4]: ro.r("print(v)")
[1]
1
2
3
4
5
Out[4]:
<FloatVector - Python:0x7fb4791e5f08/R:0x2f7eed0>
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000]
In [5]: ro.r("class(v)")
Out[5]:
<StrVector - Python:0x7fb4791e5548/R:0x2d02658>
['numeric']
danke! für die zweite Frage, ich füge tatsächlich x_ro zum env hinzu, ich habe vergessen, es hier zu kopieren. Die Klasse von x_ro ist str vector still. Für die erste Frage möchte ich einen Weg finden, den str-Vektor in python durch rpy2 in den float-Vektor zu zwingen, anstatt 'r ('')' zu verwenden. aber es funktioniert nicht. – user5025141
Keine Notwendigkeit, ein rpy2-Objekt an ein Symbol im R 'globalenv' zu binden, um seine Klasse in R zu kennen. Tun Sie einfach 'tuple (x_ro.rclass)'. – lgautier
@lgautier good catch (in der Tat habe ich versucht, die Tatsache zu betonen, dass das OP seine Klasse in R getestet hat, von einem rpy2-Objekt, ohne ursprünglich (Frage wurde bearbeitet), binden explizit diese 2 Objekte, die haben könnte B. – mgc