1

ここで SO や他の場所に関するさまざまな議論を見てきましたが、一般的なコンセンサスは、R 関数から複数の類似していないデータ構造を返す場合、それらは として返され、list(a, b)次にインデックスによってアクセスされる0などの1ようです。の上。ただし、Perl プログラム内で PL/R を介して R 関数を使用する場合、Rlist関数はリストを平坦化し、数値も文字列化します。例えば

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

返される 2 つの配列が対称ではなく、関数が鳴るので、 a を使用してdata.frameも機能しません。

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

補遺: 私の質問の主な目的は、PL/R 関数から複数の異なるデータ構造を返す方法です。ただし、データを JSON に変換すると、サーバーとユーザーの間で転送される無駄なデータに余分な引用符が追加されるため、上記の文字列化と二次的な文字列化にも問題があります。

4

1 に答える 1

0

ここでいくつかの問題があると思います。1 つ目は、PostgreSQL の配列チェックに合格しないため、この場合、単に配列を返すことはできないということです (配列は対称である必要があり、すべて同じ型である必要があります)。クエリ インターフェイスを介して PL/Perl から PL/R を呼び出す場合、PostgreSQL の型の制約が問題になることに注意してください。

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

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

次のような 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 プランナーが理解できるデータ構造にそれを配置する必要があり、それがあなたの例に欠けていると思います。

于 2013-03-25T01:30:42.910 に答える