如何使用rpy2映射Python元组和R列表?

4 投票
2 回答
2146 浏览
提问于 2025-04-16 01:38

我在理解 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' 对象不支持项赋值

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

2 个回答

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)
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。你不能用类似 robjects.r.data.frame 的方式在 Python 中访问这些符号,因为 Python 对句点的理解和 R 不一样。所以我建议完全避免这种写法,改用 robjects.r['data.frame'],因为这种写法无论符号名称是什么都能正常工作。

撰写回答