Python 关键字错误:使用rpy2在geoR中调用as.geodata函数

Python 关键字错误:使用rpy2在geoR中调用as.geodata函数,python,r,rpy2,geor,Python,R,Rpy2,Geor,我正在处理的脚本中得到SyntaxError:keyword不能是表达式 我使用Python中的rpy2(以及R包geoR)来处理使用R的数据库函数从PostgreSQL数据库检索的数据表。该数据是带有坐标的空间数据和两列数值数据,将用于地质统计模型 在数据库查询调用之后,dataframe对象x如下所示: easting northing location attrib1 attrib2 category 1 658394.3 204987.5 p1

我正在处理的脚本中得到
SyntaxError:keyword不能是表达式

我使用Python中的
rpy2
(以及R包
geoR
)来处理使用R的数据库函数从PostgreSQL数据库检索的数据表。该数据是带有坐标的空间数据和两列数值数据,将用于地质统计模型

在数据库查询调用之后,dataframe对象x如下所示:

    easting northing location attrib1 attrib2    category
1  658394.3 204987.5       p1         4.91        26.17 soil
2  658657.1 205116.7       p2         4.85        27.43 soil
...
我为geoR函数创建一个对象,如下所示:

    easting northing location attrib1 attrib2    category
1  658394.3 204987.5       p1         4.91        26.17 soil
2  658657.1 205116.7       p2         4.85        27.43 soil
...
从rpy2.robjects.packages导入导入 geo=importr('geoR'))

将geoR函数调用为

y=geo.as_geodata(x)  
工作,但没有参数data.col,它将位置属性指定为数据属性。(默认情况下,坐标属性后的第一列。)

尝试:

y=geo.as_geodata(x,geo.data_col="4:5")
产生:

SyntaxError: keyword can't be an expression

我似乎绕不开它。我在这里查看了一些帖子,并在网上查看了一下,但我无法理解这一条。

我认为错误是因为您试图将两列传递给
data\u col
命令。下面是一个使用
gstat
包中的
meuse
数据集的工作示例

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr 
geo = importr('geoR')
gstat= importr("gstat")
robjects.r("data(meuse)")
x = robjects.r("meuse")
y = geo.as_geodata(x,data_col=5,coords_col="1:2")
vario = geo.variog(y)
robjects.r.plot(vario)
但是,您会注意到上面的方法不起作用,因为
geoR
似乎没有获得
coords.col
data.col
参数。我不知道为什么会这样,但解决这个问题的一个方法是编写一个包装函数

robjects.r('''
geodata_python <- function(obj) {
        return(as.geodata(obj, data.col=5, coords.col=1:2))
}
''')
geodata_wrapper =  robjects.globalenv['geodata_python']
y = geodata_wrapper(x)
vario = geo.variog(y)
robjects.r.plot(vario)
robjects.r(“”)

geodata_pythonRpy2是通向python的桥梁,在必要时将python类型映射到R类型。 这里您传递了一个值为“4:5”的参数,即Python
str
。该参数将成为一个R
字符(R行话中的字符串向量)

当您编写一个R函数调用,例如
foo(bar=4:5)
时,您正在编写的是R代码作为参数
bar
的值,该代码将被计算以给出实际参数

我想你想要的是:

from rpy2.robjects.vectors import IntVector
y=geo.as_geodata(x, data_col = IntVector((4,5)))


很抱歉回复太晚。我不得不转移到其他项目,但又回到了这个项目。我已经根据这些回复让它工作了。干杯!