Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RPy2的奇怪问题_Python_R_Python Idle - Fatal编程技术网

Python RPy2的奇怪问题

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交互式解释器中,如果表达式返回一

从安装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交互式解释器中,如果表达式返回一个值,那么该值将自动打印。例如,如果您创建一个字典并从中提取一个值,该值将自动打印,但如果这是在一个正在执行的脚本中,则情况并非如此。请看以下简单示例,这不是错误,只是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
强制返回基本Python类型

作为一个示例,我使用它将R列表转换为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
要访问命名列表的元素(“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')])