Легче идентифицировать проблему с полностью работающим примером. Без этого я испытываю соблазн сказать, что он работает так, как ожидалось.
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).
Установив, что мы можем строить R векторов поплавка из Python, мы можем смотреть на ли связывание его с символом в R и доступа к этому объекту из R делает никакой разницы. Это не так:
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']
спасибо! для второго вопроса я фактически добавляю x_ro в env, я забыл скопировать его здесь. Класс x_ro все еще является str-вектором. По первому вопросу, я хочу найти способ заставить str-вектор в float-векторе в python через rpy2 вместо использования 'r ('')'. но это не сработает. – user5025141
Не нужно связывать объект rpy2 с символом в R 'globalenv', чтобы знать его класс в R. Просто выполните' tuple (x_ro.rclass) '. – lgautier
@lgautier good catch (на самом деле я больше всего пытался подчеркнуть тот факт, что OP тестировал свой класс в R, из объекта rpy2, не имея первоначально (вопрос был отредактирован), явно связывает тезисы с двумя объектами, которые могут иметь было легко пропущено с помощью тех же имен переменных, например: – mgc