Python RPy2的奇怪问题
从安装RPy2后 我试图在Python 2.6 IDLE中使用它,但遇到以下错误:Python RPy2的奇怪问题,python,r,python-idle,Python,R,Python Idle,从安装RPy2后 我试图在Python 2.6 IDLE中使用它,但遇到以下错误: >>> import rpy2.robjects as robjects >>> robjects.r['pi'] <RVector - Python:0x0121D8F0 / R:0x022A1760> >>将rpy2.robject作为robject导入 >>>robjects.r['pi'] 我做错了什么?在Python交互式解释器中,如果表达式返回一
>>> import rpy2.robjects as robjects
>>> robjects.r['pi']
<RVector - Python:0x0121D8F0 / R:0x022A1760>
>>将rpy2.robject作为robject导入
>>>robjects.r['pi']
我做错了什么?在Python交互式解释器中,如果表达式返回一个值,那么该值将自动打印。例如,如果您创建一个字典并从中提取一个值,该值将自动打印,但如果这是在一个正在执行的脚本中,则情况并非如此。请看以下简单示例,这不是错误,只是python打印表达式的结果:
>>> mymap = {"a":23}
>>> mymap["a"]
23
python脚本中的相同代码根本不会产生任何输出
在您的代码中,您正在使用以下代码访问类似于地图的结构:
>robjects.r['pi']
这将返回某些R2Py对象,其默认字符串表示形式为:
如果您将代码更改为以下内容:
pi=robjects.r['pi']
您将看不到任何输出,但调用的结果(向量)将分配给变量pi
,并可供您使用
查看向量,似乎许多对象默认打印为括号中的类型和一些内存地址信息。是否尝试查看返回的向量
>>> pi = robjects.r['pi']
>>> pi[0]
3.14159265358979
进一步说明Shane的答案。rpy2使用以下Python对象来表示基本的R类型:
- RVector:R标量和向量,R列表表示为带名称的RVector,请参见下文
- RArray:一个R矩阵,本质上是一个维数的向量
- RDataFrame:R data.frame
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
要访问命名列表的元素(“object$attribute”R语法),我使用
但我认为一定有更好的解决方案……我发现这是关于如何从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')])
[69]中的:将numpy作为np导入
在[70]中:将rpy2.robjects作为ro导入
在[71]中:df=ro.r['data.frame'](a=r.c(1,2,3),b=r.c(4.0,5.0,6.3))
In[72]:df
出[72]:
In[73]:打印(df)
a b
1 1 4.0
2 2 5.0
3 3 6.3
在[74]中:recdf=np.rec.fromArray(df,names=tuple(df.names))
In[75]:recdf
出[75]:
记录数组([(1,4.0),(2,5.0),(3,6.29999998)],
dtype=[('a','我不使用IDLE,但如果它直接在解释器中,你不会做错什么(例外在哪里?)。你期望什么?(1)不要对你自己的问题发表评论。更新你的问题以包括“R2.9.1”事实。(2)你为什么认为这是一个“错误”?它看起来像一个RVector对象。fromarrays()的使用很好)。这将是automagic rpy/numpy转换模块的一部分。
>>> 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
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')])