从PL / R中的R函数返回多个不同的数据结构

时间:2012-01-14 14:35:09

标签: perl r postgresql plr

我一直在关注SO和其他地方的各种讨论,并且普遍的共识似乎是如果一个人从R函数返回多个非相似数据结构,它们最好作为list(a, b)返回并且然后由索引01访问,依此类推。除了在Perl程序中通过PL / R使用R函数时,R list函数会使列表变平,并且甚至会对数字进行字符串化。例如

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

使用data.frame不起作用,因为返回的两个数组不对称,并且函数会破坏。

那么,我如何从由任意一组嵌套数据结构组成的R函数返回单个数据结构,并且仍然能够从Perl访问每个单独的包,只需$res->[0],{ {1}}或$res->[1]$res->{'employees'}更新:我正在寻找一个R等效的Perl $res->{'pets'}甚至[[1, "foo", 3], [2, "bar"]]

附录:我的问题的主要内容是如何从PL / R函数返回多个不同的数据结构。但是,如上所述,字符串化和辅助字符串也存在问题,因为我将数据转换为JSON,所有这些额外的引号只会添加到服务器和用户之间传输的无用数据。

1 个答案:

答案 0 :(得分:0)

我认为你在这里遇到了一些问题。第一个是你不能只在这种情况下返回一个数组,因为它不会传递PostgreSQL的数组检查(数组必须是对称的,所有相同的类型等)。请记住,如果您通过查询接口从PL / Perl调用PL / R,PostgreSQL类型约束将成为一个问题。

你有几个选择。

您可以返回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规划者可以理解的数据结构中,这就是我认为你的例子中缺少的。