从
安装RPy2后http://rpy.sourceforge.net/rpy2.html
我正在尝试在Python 2.6 IDLE中使用它,但是我收到了这个错误:
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
我做错了什么?
答案 0 :(得分:8)
您是否尝试过查看返回的矢量?
>>> pi = robjects.r['pi']
>>> pi[0]
3.14159265358979
答案 1 :(得分:5)
扩展Shane的答案。 rpy2使用以下Python对象来表示基本的R类型:
强制回归基本的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')])
此时似乎有点偏离主题,但我不确定采用这个问题的适当程序是什么?我的回答!