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

时间:2012-07-13 15:08:21

标签: python r rpy2 geor

我正在处理正在处理的脚本中SyntaxError: keyword can't be an expression

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

在数据库查询调用之后,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函数创建了一个对象:

来自rpy2.robjects.packages导入导入程序 geo = importr('geoR')

将geoR函数调用为

y=geo.as_geodata(x)  

工作,但没有参数data.col,它将location属性指定为数据属性。 (坐标属性之后的第一列是默认值。)

尝试:

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

产生:

SyntaxError: keyword can't be an expression

我似乎无法绕过它。我在这里查了几篇帖子并在网上看了一下,但我无法想出这个。

2 个答案:

答案 0 :(得分:0)

我认为错误是由于您尝试将两列传递给data_col命令。以下是使用meuse包中的gstat数据集的工作示例。

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.coldata.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)

使用上述方法,您可以将其他参数传递给as.geodata环境中geodata_python函数内的R函数。

HTH

答案 1 :(得分:0)

Rpy2是Python的桥梁,在必要时将Python类型映射到R类型。 在这里传递值为“4:5”的参数,即Python str。该参数变为R character(R术语中的字符串向量)。

当您编写一个R函数调用,例如foo(bar = 4:5)时,您编写的是R代码作为参数bar的值,将评估该代码以提供实际参数。

我认为你想要的是:

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

base = importr('base')
y=geo.as_geodata(x, data_col = base.c(4,5))