关于使用rpy2评估表达式的指导
我刚接触R和rpy2这两个东西。我正在尝试把下面这个例子
library(MASS) # for eqscplot
data(topo, package="MASS")
topo.kr <- surf.ls(2, topo)
trsurf <- trmat(topo.kr, 0, 6.5, 0, 6.5, 50)
转换成rpy2的格式。
到目前为止,我已经写了
import rpy2.robjects as robjects
robjects.r('library(spatial)')
f1 = robjects.r['surf.ls']
x = robjects.IntVector([1,2,3])
y = robjects.IntVector([1,2,3])
z = robjects.IntVector([1,30,3])
res = f1(2, x,y,z)
我想结果应该是res
。但是当我用print(res.r_repr())
打印res
的时候,得到的是一个我无法理解的表达式。希望能得到一些帮助。
2 个回答
2
那么问题就变成了:我该如何把一个R语言的列表转换成Python的字典(这和评估表达式关系不大)。使用rpy2-2.2.x(和2.3-dev)可以做到这一点:
from rpy2.robjects.vectors import ListVector
# make an R list
l = ListVector({'a': 1, 'b': 'b'})
# get a Python dict out of an R list
dict(l.iteritems())
1
你的代码运行得很好。我觉得你只是遇到了访问结果的问题。你得到的“res”对象其实就是一个R语言的列表。我建议把它转换成对应的Python字典。
rListObj = {}
for key,val in zip(robjects.r.names(res),res):
rListObj[key] = [i for i in val] #R Vector to List
结果是:
{'f': [1.0, 1.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0], 'rx': [1, 3], 'ry': [1, 3], 'np': [2], 'beta': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 'r': [-1.7320508075688772, -1.6729239521451333e-16, -1.4142135623730951, -1.1547005383792512, -5.187907395343139e-17, -0.8164965809277259, -1.6729239521451333e-16, -1.4142135623730951, 3.415236843329339e-17, nan, -1.1547005383792512, -5.187907395343139e-17, -0.8164965809277259, nan, 0.0, -1.1547005383792512, -5.187907395343139e-17, -0.8164965809277259, nan, 0.0, 0.0], 'call': [<SignatureTranslatedFunction - Python:0xb7539dec / R:0xa686cec>, <IntVector - Python:0xb7534cac / R:0xa69e788>, <IntVector - Python:0xb7534d2c / R:0xa5f72f8>, <IntVector - Python:0xb7534c2c / R:0xa5f7320>, <IntVector - Python:0xb7534bac / R:0xa5f7348>], 'y': [1, 2, 3], 'x': [1, 2, 3], 'z': [1, 30, 3], 'wz': [0.0, 0.0, 0.0]}
我用一个比较旧的rpy2版本(2.1.9)测试过这个,可能在更新的版本中有更炫酷的方法来实现这个。