2012-01-14 13 views
1

ここではSOなどのさまざまな議論を検討していますが、R関数から複数の非類似データ構造を返すと、彼らはlist(a, b)として返され、インデックス01などによってアクセスされます。ただし、Perlプログラムの中でPL/Rを介してR関数を使用する場合、R list関数はリストを平坦化し、さらに数値を文字列化します。例えば二つの配列が返されるので、動作しないdata.frameを使用PL/RのR関数から複数の異なるデータ構造を返す

my $res = $sth->fetchrow_arrayref; 
# now, $res is a single, flattened, stringified list 
# even though the R function was supposed to return 
# list([1, "foo", 3], [2, "bar"]) 
# 
# instead, $res looks like c(\"1\", \""foo"\", \"3\", \"2\", \""bar"\") 
# or some such nonsense 

ために対称ではなく、機能croaks。

だから、私はPerlなどの単純$res->[0]$res->[1]または$res->{'employees'}から、個々のバンドルにアクセスすることができ、まだネストされたデータ構造の任意のセットで構成されてR関数から単一のデータ構造を返し、そしてどのように行います、 $res->{'pets'}更新:私はPerlの​​5あるいは[[1, "foo", 3], {a => 2, b => "bar"}]

補遺のRの当量を探しています:私の質問の主な推進力は、PL/Rの関数から複数の異なるデータ構造を返す方法です。しかし、上記のような文字列化とセカンダリは、データをJSONに変換し、これらの余分な引用符をすべてサーバーとユーザーの間で転送される無駄なデータに追加するだけで問題になります。

+0

perlは弱く型付けされているので、数字が文字列化されているかどうかは関係ありません。 – Ilion

+0

質問の補足を明確にしました。簡潔に言えば、ストリンジェナイテーションは二次的な問題ですが、それは確かに問題です。 1つは、配列やハッシュのようにインデックスを使用して別のデータ構造体を取得することはできません.2つは、すべての余分な引用符を使ってデータを転送し、データ転送に太さを追加します。 – punkish

答えて

0

ここにはいくつかの問題があると思います。最初は、PostgreSQLの配列チェック(配列は対称でなければならず、同じ型のものなど)を渡さないので、この場合は配列を返すことができません。 PL/Perlからクエリインタフェースを介してPL/Rを呼び出している場合、PostgreSQLの型制約が問題になることに注意してください。

あなたにはいくつかのオプションがあります。

行ごとに1つのデータ型でtextof []を返すことができます。

あなたは次のように、PostgreSQLは理解した構造を使用して構造化データのいくつかの並べ替えを返すことができます:これは、あなたが何かを返すことができるようになる

CREATE TYPE ab AS (
    a text, 
    b text 
); 

CREATE TYPE r_retval AS (
    labels text[], 
    my_ab ab 
); 

{labels => [1, "foo", 3], ab => {a => 'foo', b => 'bar'} } 

しかし、あなたが配置する必要が任意の割合でそれをPostgreSQLプランナが理解できるデータ構造に変換し、それがあなたの例にないと思います。

関連する問題