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

问题描述:

我正在使用我正在处理的脚本中的SyntaxError: keyword can't be an expression关键字错误:使用rpy2在geoR中调用as.geodata函数

我在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 地理= 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_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.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) 

使用上面的方法,你可以在R环境中geodata_python函数中传递额外的参数给as.geodata功能。

HTH

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)) 
+0

道歉这么晚才回复。我不得不转向其他项目,但已经回到了这个项目。我已经根据这些回复得到了它的工作。干杯! – damian 2012-10-04 16:17:16