2010-07-21 3 views
4

У меня возникли проблемы с пониманием сопоставления с объектом rpy2 и объектом python.Сопоставление кортежей python и списка R с rpy2?

У меня есть функция (x), которая возвращает объект кортежа в python, и я хочу нанести на карту этот объект tuple с помощью R-списка объектов или вектора.

Во-первых, я пытаюсь сделать это:

# return a python tuple into this r object tlist 
robjects.r.tlist = get_max_ticks(x) 

#Convert list into dataframe 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

FAIL с ошибкой: rinterface.RRuntimeError: Ошибка в Eval (выражение, Envir, Enclos): объект 'TList' не найден

Так я пытаюсь в другую стратегию:

robjects.r["tlist"] = get_max_ticks(x) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 

FAIL с этой ошибкой: ТипError: Объект 'R' не поддерживает назначение предметов

Не могли бы вы помочь мне разобраться? Спасибо большое!

ответ

3

Использование globalEnv:

import rpy2.robjects as ro 
r=ro.r 

def get_max_ticks(): 
    return (1,2) 
ro.globalEnv['tlist'] = ro.FloatVector(get_max_ticks()) 
r('x <- as.data.frame(tlist,row.names=c("seed","ticks"))') 
print(r['x']) 
#  tlist 
# seed  1 
# ticks  2 

Это может быть возможным, чтобы получить доступ символов в R пространстве имен с этим типом обозначения: robjects.r.tlist, но вы не можете присвоить значения таким образом. Способ назначения символа - использовать robject.globalEnv.

Кроме того, некоторые символы в R могут содержать период, например data.frame. Вы не можете получить доступ к таким символам в Python, используя нотацию, похожую на robjects.r.data.frame, поскольку Python интерпретирует период иначе, чем R. Поэтому я предлагаю полностью исключить эту нотацию и вместо этого использовать robjects.r['data.frame'], так как эта нотация работает независимо от имени символа.

+1

Эта запись не является безопасным, поскольку делать что-то вроде = ro.r ("функции«ro.globalEnv [ „“] data.frame (x) NULL ') "где-то раньше вызовет проблему. Я рекомендую использовать класс DataFrame. – lgautier

+0

Thx @ ~ unutbu, thx @lgautier для вашего ответа здесь и в списке макияжа, теперь я пытаюсь понять пример с объектом data.frame в руководстве – reyman64

0

Вы также могли бы избежать назначения в R все вместе:

import rpy2.robjects as ro 
tlist = ro.FloatVector((1,2)) 
keyWordArgs = {'row.names':ro.StrVector(("seed","ticks"))} 
x = ro.r['as.data.frame'](tlist,**keyWordArgs) 
ro.r['print'](x) 
Смежные вопросы