0

我正在SyntaxError: keyword can't be an expression编写我正在编写的脚本。

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

数据库查询调用后,数据框对象 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 导入 importr 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

我似乎无法绕过它。我在这里查看了一些帖子并在网上四处查看,但我无法弄清楚这一点。

4

2 回答 2

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))
于 2012-07-14T09:55:55.347 回答
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.colordata.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

高温高压

于 2012-07-14T02:34:10.443 回答