从安装 RPy2 后
http://rpy.sourceforge.net/rpy2.html
我正在尝试在 Python 2.6 IDLE 中使用它,但出现此错误:
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
我做错了什么?
从安装 RPy2 后
http://rpy.sourceforge.net/rpy2.html
我正在尝试在 Python 2.6 IDLE 中使用它,但出现此错误:
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
我做错了什么?
您是否尝试过查看返回的向量?
>>> pi = robjects.r['pi']
>>> pi[0]
3.14159265358979
扩展Shane的答案。rpy2 使用以下 Python 对象来表示基本的 R 类型:
要强制回到基本的 Python 类型,请看这里。
例如,我使用它来将 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]
这不是错误,它只是返回的 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
但我认为必须有更好的解决方案......
在 Python 交互式解释器中,如果表达式返回一个值,则该值会自动打印。例如,如果您创建一个字典并从中提取一个值,则该值会自动打印,但如果这是在执行脚本中,则情况并非如此。看下面这个简单的例子,这不是错误,只是 python 打印表达式的结果:
>>> mymap = {"a":23}
>>> mymap["a"]
23
python 脚本中的相同代码根本不会产生任何输出。
在您的代码中,您正在使用代码访问类似地图的结构:
>>> robjects.r['pi']
这将返回一些 R2Py 对象,其默认字符串表示形式为:<RVector - Python:0x0121D8F0 / R:0x022A1760>
如果您将代码更改为以下内容:
pi = robjects.r['pi']
您将看不到任何输出,但调用的结果(向量)将分配给变量pi
并可供您使用。
查看R2Py 文档似乎许多对象默认打印为 <> 括号中的类型和一些内存地址信息。
我发现这是关于如何在 R 对象和 python 之间来回切换的唯一明智、简短的讨论。naufraghi 的解决方案提示了以下方法来转换 data.frame,它保留了 dataframe 更好的切片功能:
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')])
在这一点上似乎有点离题,但我不确定捕捉我的这个问题和答案的适当程序是什么!