2012-07-13 29 views
0

我正在使用我正在處理的腳本中的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 

我似乎無法避開它。我在這裏看了幾個帖子並在網上看了一下,但我無法弄清楚這一點。

回答

0

我想這個錯誤是由於你試圖傳遞兩列到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

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

道歉這麼晚纔回復。我不得不轉向其他項目,但已經回到了這個項目。我已經根據這些回覆得到了它的工作。乾杯! – damian 2012-10-04 16:17:16