我正在处理正在处理的脚本中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
我似乎无法绕过它。我在这里查了几篇帖子并在网上看了一下,但我无法想出这个。
答案 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.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)
使用上述方法,您可以将其他参数传递给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))