关键字错误:使用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.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)
使用上面的方法,你可以在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))
道歉这么晚才回复。我不得不转向其他项目,但已经回到了这个项目。我已经根据这些回复得到了它的工作。干杯! – damian 2012-10-04 16:17:16