4

我在理解与 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"))')

失败并出现错误: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"))')

失败并出现此错误:TypeError: 'R' object does not support item assignment

你能帮我理解吗?非常感谢 !!

4

2 回答 2

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'],因为无论符号名称是什么,这种表示法都有效。

于 2010-07-21T15:26:50.240 回答
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)
于 2010-07-21T15:45:13.583 回答