首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关键字错误:使用rpy2调用geoR中的as.geodata函数

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

Stack Overflow用户
提问于 2012-07-13 23:08:21
回答 2查看 540关注 0票数 0

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

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

在数据库查询调用之后,dataframe对象x如下所示:

代码语言:javascript
复制
    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函数创建了一个对象,如下所示:

from import import geo = rpy2.robjects.packages (‘geoR’)

将geoR函数调用为

代码语言:javascript
复制
y=geo.as_geodata(x)  

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

正在尝试:

代码语言:javascript
复制
y=geo.as_geodata(x,geo.data_col="4:5")

产生:

代码语言:javascript
复制
SyntaxError: keyword can't be an expression

我似乎绕不开它。我已经看了这里的一些帖子,也在网上四处看看,但我不能理解这一条。

EN

回答 2

Stack Overflow用户

发布于 2012-07-14 10:34:10

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

代码语言:javascript
复制
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参数。我不确定为什么会这样,但是解决这个问题的方法是编写一个包装函数。

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2012-07-14 17:55:55

Rpy2是连接Python的桥梁,只要有必要就会将Python类型映射到R类型。在这里,您传递了一个值为"4:5“的参数,这是一个Python str。该参数变成一个R character (R术语中的字符串向量)。

当您编写一个R函数调用时,例如foo(bar = 4:5),您正在编写的是R代码作为参数bar的值,该代码将被计算为给出实际的参数。

我认为你想要的是:

代码语言:javascript
复制
from rpy2.robjects.vectors import IntVector
y=geo.as_geodata(x, data_col = IntVector((4,5)))

代码语言:javascript
复制
base = importr('base')
y=geo.as_geodata(x, data_col = base.c(4,5))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11473206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档