RPy2的奇怪问题

2 投票
5 回答
1545 浏览
提问于 2025-04-15 15:31

在从这个网站安装了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 个回答

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文档来看,很多对象默认会以<>括号中的类型和一些内存地址信息的形式打印出来。

5

为了更好地理解Shane的回答,rpy2这个工具用一些Python对象来表示基本的R类型:

  • RVector:R中的标量和向量,R列表被表示为带有名称的RVector,具体见下文
  • RArray:一个R矩阵,实际上就是带有维度的RVector
  • RDataFrame:一个R的数据框

如果你想把这些R类型转换回基本的Python类型,可以查看这里

举个例子,我用这个方法把一个R列表转换成Python的字典:

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]
8

你有没有试着看看返回的那个向量?

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

撰写回答