0

SyntaxError: keyword can't be an expressionが取り組んでいるスクリプトに入っています。

R のデータベース関数を使用して PostgreSQL データベースから取得したデータ テーブルを操作するために、Python でrpy2(および R パッケージ) を使用しています。geoRデータは、地理統計モデルで使用される座標と 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 関数のオブジェクトを作成します。

from rpy2.robjects.packages import importr geo = 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

私はそれを回避することができないようです。ここでいくつかの投稿を見て、オンラインで見回しましたが、これを理解できません。

4

2 に答える 2

0

エラーは、コマンドに 2 つの列を渡そうとしたことが原因だと思います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.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)

上記の方法を使用すると、環境内の関数as.geodata内の関数に追加の引数を渡すことができます。geodata_pythonR

HTH

于 2012-07-14T02:34:10.443 に答える
0

Rpy2 は Python へのブリッジであり、必要に応じて Python 型を R 型にマッピングします。ここでは、値 "4:5" のパラメーター、つまり Python を渡しますstr。そのパラメーターは R character(R 用語では文字列のベクトル) になります。

foo(bar = 4:5)パラメーターの値として R コードを記述しているなどの 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))
于 2012-07-14T09:55:55.347 に答える