Странная проблема с RPy2 - PullRequest
       32

Странная проблема с RPy2

2 голосов
/ 30 октября 2009

После установки RPy2 из

http://rpy.sourceforge.net/rpy2.html

Я пытаюсь использовать его в Python 2.6 IDLE, но получаю эту ошибку:

>>> import rpy2.robjects as robjects
>>> robjects.r['pi']

<RVector - Python:0x0121D8F0 / R:0x022A1760>

Что я делаю не так?

Ответы [ 5 ]

8 голосов
/ 30 октября 2009

Вы пытались посмотреть на вектор, который вернулся?

 >>> pi = robjects.r['pi']
 >>> pi[0]
 3.14159265358979
5 голосов
/ 30 октября 2009

Чтобы расширить ответ Шейна. rpy2 использует следующие объекты Python для представления основных типов R:

  • RVector: R скаляры и векторы, R списки представлены в виде RVectors с именами, см. Ниже
  • RArray: матрица R, по существу RVector с размером
  • RDataFrame: R data.frame

Чтобы вернуться к базовым типам Python , посмотрите здесь .

В качестве примера, я использую это для преобразования списка R в диктон Python:

rList = ro.r('''list(name1=1,name2=c(1,2,3))''')
pyDict = {}
for name,value in zip([i for i in rList.getnames()],[i for i in rList]):
    if len(value) == 1: pyDict[name] = value[0]
    else: pyDict[name] = [i for i in value]
1 голос
/ 15 апреля 2010

Это не ошибка, это просто 'repr' возвращаемого робота:

>>> r['pi']
<RVector - Python:0x2c14bd8 / R:0x3719538>
>>> repr(r['pi'])
'<RVector - Python:0x4b77908 / R:0x3719538>'
>>> str(r['pi'])
'[1] 3.141593'
>>> print r['pi']
[1] 3.141593

Вы можете получить значение 'pi', обращаясь к нему по индексу

>>> r['pi'][0]
3.1415926535897931

Для доступа к элементу именованных списков (синтаксис object $ атрибут 'R) я использую

>>> l = r.list(a=r.c(1,2,3), b=r.c(4,5,6))
>>> print l
$a
[1] 1 2 3

$b
[1] 4 5 6

>>> print dict(zip(l.names, l))['a']
[1] 1 2 3

но я думаю, что должно быть лучшее решение ...

1 голос
/ 30 октября 2009

В интерактивном интерпретаторе Python, если выражение возвращает значение, оно автоматически печатается. Например, если вы создаете словарь и извлекаете из него значение, оно автоматически печатается, но если это было в исполняемом скрипте, это не имело бы место. Посмотрите на следующий простой пример: это не ошибка, а просто python, печатающий результат выражения:

>>> mymap = {"a":23}
>>> mymap["a"]
23

Тот же код в скрипте Python не будет выводить вообще.

В вашем коде вы получаете доступ к структуре, подобной карте, с кодом:

>>> robjects.r['pi']

Это возвращает некоторый объект R2Py, для которого строковое представление по умолчанию: <RVector - Python:0x0121D8F0 / R:0x022A1760>

Если вы изменили код на что-то вроде:

pi = robjects.r['pi']

вы не увидите выходных данных, но результат вызова (вектор) будет присвоен переменной pi и будет доступен для использования.

Просмотр документации R2Py Кажется, что многие объекты по умолчанию печатаются в виде шрифта в скобках <> и некоторой информации об адресе памяти.

0 голосов
/ 07 октября 2010

Я нашел это как единственное разумное, короткое обсуждение того, как переходить назад и вперед от объектов R и python. Решение naufraghi подтолкнуло к следующему подходу к преобразованию data.frame, который сохраняет лучшие возможности среза dataframe:

In [69]: import numpy as np

In [70]: import rpy2.robjects as ro

In [71]: df = ro.r['data.frame'](a=r.c(1,2,3), b=r.c(4.0,5.0,6.3))

In [72]: df
Out[72]: <RDataFrame - Python:0x5492200 / R:0x4d00a28>

In [73]: print(df)
  a   b
1 1 4.0
2 2 5.0
3 3 6.3

In [74]: recdf = np.rec.fromarrays(df, names=tuple(df.names))

In [75]: recdf
Out[75]: 
rec.array([(1, 4.0), (2, 5.0), (3, 6.2999999999999998)], 
      dtype=[('a', '<i4'), ('b', '<f8')])

Кажется, немного не по теме в данный момент, но я не уверен, какой будет подходящая процедура, чтобы захватить этот вопрос и мой ответ!

...