用rpy2将Python元组和R列表进行映射?

4
我在理解rpy2对象和Python对象之间的映射时遇到了一些困难。
我有一个返回Python元组对象的函数(x),我想将这个元组对象与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: 在执行表达式时出错:对象“tlist”未找到

因此,我正在尝试另一种策略:

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

出现以下错误: TypeError: 'R'对象不支持项目分配

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

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。您无法使用类似于robjects.r.data.frame的表示法在Python中访问这样的符号,因为Python解释句点与R不同。因此,我建议完全避免此表示法,而改用robjects.r['data.frame'],因为此表示法无论符号名称如何都有效。

1
这种表示法也不安全,因为在之前执行类似于“ro.globalEnv['data.frame'] = ro.r('function(x) NULL')”的操作会导致问题。我建议使用DataFrame类。 - lgautier
谢谢@~unutbu,谢谢@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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接