RPy2的奇怪问题

时间:2009-10-30 12:24:28

标签: python r python-idle

安装RPy2后

http://rpy.sourceforge.net/rpy2.html

我正在尝试在Python 2.6 IDLE中使用它,但是我收到了这个错误:

>>> import rpy2.robjects as robjects
>>> robjects.r['pi']

<RVector - Python:0x0121D8F0 / R:0x022A1760>

我做错了什么?

5 个答案:

答案 0 :(得分:8)

您是否尝试过查看返回的矢量?

 >>> pi = robjects.r['pi']
 >>> pi[0]
 3.14159265358979

答案 1 :(得分:5)

扩展Shane的答案。 rpy2使用以下Python对象来表示基本的R类型:

  • RVector:R标量和向量,R列表表示为带有名称的RVectors,见下文
  • RArray:R矩阵,基本上是具有维度
  • 的RVector
  • RDataFrame:R data.frame

强制回归基本的Python类型look here

作为示例,我使用它将R List转换为python dict:

rList = ro.r('''list(name1=1,name2=c(1,2,3))''')
pyDict = {}
for name,value in zip([i for i in rList.getnames()],[i for i in rList]):
    if len(value) == 1: pyDict[name] = value[0]
    else: pyDict[name] = [i for i in value]

答案 2 :(得分:1)

在Python交互式解释器中,如果表达式返回一个值,则会自动打印该值。例如,如果您创建一个字典并从中提取值,则会自动打印该值,但如果这是在执行脚本中,则情况并非如此。看看下面的简单示例,这不是错误,只是python打印表达式的结果:

>>> mymap = {"a":23}
>>> mymap["a"]
23

python脚本中的相同代码根本不会产生任何输出。

在您的代码中,您正在使用代码访问类似结构的地图:

>>> robjects.r['pi']

这将返回一些R2Py对象,其默认字符串表示形式为:<RVector - Python:0x0121D8F0 / R:0x022A1760>

如果您将代码更改为:

pi = robjects.r['pi']

您将看不到输出,但调用的结果(向量)将被分配给变量pi并可供您使用。

查看R2Py documentation默认情况下,许多对象默认打印为&lt;&gt;中的类型括号和一些内存地址信息。

答案 3 :(得分:1)

这不是错误,它只是返回的robject的'repr':

>>> r['pi']
<RVector - Python:0x2c14bd8 / R:0x3719538>
>>> repr(r['pi'])
'<RVector - Python:0x4b77908 / R:0x3719538>'
>>> str(r['pi'])
'[1] 3.141593'
>>> print r['pi']
[1] 3.141593

您可以通过索引

获取“pi”的值
>>> r['pi'][0]
3.1415926535897931

要访问命名列表的元素(' object $ attribute 'R语法),我使用

>>> l = r.list(a=r.c(1,2,3), b=r.c(4,5,6))
>>> print l
$a
[1] 1 2 3

$b
[1] 4 5 6

>>> print dict(zip(l.names, l))['a']
[1] 1 2 3

但我认为必须有更好的解决方案......

答案 4 :(得分:0)

我发现这是关于如何从R对象和python来回走动的唯一合理,简短的讨论。 naufraghi的解决方案促使了以下方法转换data.frame,它保留了数据帧的更好的切片功能:

In [69]: import numpy as np

In [70]: import rpy2.robjects as ro

In [71]: df = ro.r['data.frame'](a=r.c(1,2,3), b=r.c(4.0,5.0,6.3))

In [72]: df
Out[72]: <RDataFrame - Python:0x5492200 / R:0x4d00a28>

In [73]: print(df)
  a   b
1 1 4.0
2 2 5.0
3 3 6.3

In [74]: recdf = np.rec.fromarrays(df, names=tuple(df.names))

In [75]: recdf
Out[75]: 
rec.array([(1, 4.0), (2, 5.0), (3, 6.2999999999999998)], 
      dtype=[('a', '<i4'), ('b', '<f8')])

此时似乎有点偏离主题,但我不确定采用这个问题的适当程序是什么?我的回答!