ここで 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 に変換すると、サーバーとユーザーの間で転送される無駄なデータに余分な引用符が追加されるため、上記の文字列化と二次的な文字列化にも問題があります。