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

Perl 从PL/R中的R函数返回多个不同的数据结构,perl,r,postgresql,plr,Perl,R,Postgresql,Plr,我一直在看SO和其他地方的各种讨论,普遍的共识似乎是,如果从R函数返回多个不相似的数据结构,最好将它们作为列表(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 func

我一直在看SO和其他地方的各种讨论,普遍的共识似乎是,如果从R函数返回多个不相似的数据结构,最好将它们作为
列表(a,b)
返回,然后通过索引
0
1
等进行访问。除此之外,当在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]
$res->[1]
$res->{'employees'}
$res->{'pets'}
update:我正在寻找与Perl的
[[1,“foo”,3],[2,“bar”]
或甚至
[[1,“foo”,3],{a=>2,b=>“bar”}]


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

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

你有两个选择

您可以返回一组文本[],每行一种数据类型

您可以使用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规划人员可以理解的数据结构中,这就是我认为您的示例中缺少的内容。

由于perl是弱类型的,所以数字是否字符串化无关紧要。添加了澄清问题的增编。简而言之,虽然严格化是一个次要问题,但它确实是一个问题。第一,我不能像使用数组或散列那样使用索引来获得单独的数据结构,第二,所有额外的引号只是把工作搞砸了,给我的数据传输增加了脂肪。