我在这里和其他地方看到了各种各样的讨论,一般的共识似乎是,如果一个人从R函数返回多个不相似的数据结构,那么最好将它们作为list(a, b)返回,然后由索引01访问。除此之外,当在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

使用data.frame不起作用,因为返回的两个数组不是对称的,并且函数发出嘎吱声。
那么,如何从由任意一组嵌套数据结构组成的R函数返回单个数据结构,并且仍然能够以简单的$res->[0]$res->[1]$res->{'employees'}$res->{'pets'}方式从Perl访问每个包呢?更新:我正在寻找Perl的R等价物[[1, "foo", 3], [2, "bar"]]甚至[[1, "foo", 3], {a => 2, b => "bar"}]
附录:我的主要问题是如何从PL/R函数返回多个不同的数据结构。但是,如上所述,stringify和secondary也有问题,因为我将数据转换为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 - 从PL/R中的R函数返回多个不同的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8862850/

10-12 17:33
查看更多