Отображение Python-кортежа и R-списка с помощью rpy2? - PullRequest
4 голосов
/ 21 июля 2010

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

У меня есть функция (x), которая возвращает объект кортежа в python, и я хочу отобразить этот объект кортежа с помощью списка объектов 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 (expr, envir, enclos): объект 'tlist' не найден

Итак, я пробую другую стратегию:

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

СБОЙ с этой ошибкой: Ошибка типа: объект 'R' не поддерживает назначение элемента

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

Ответы [ 2 ]

3 голосов
/ 21 июля 2010

Использование 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'], поскольку эта нотация работает независимо от того, как называется символ.

0 голосов
/ 21 июля 2010

Вы также можете избежать назначения в 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)
...