【问题标题】:returning multiple dissimilar data structures from R function in PL/R从 PL/R 中的 R 函数返回多个不同的数据结构
【发布时间】:2012-01-14 14:35:09
【问题描述】:

我一直在查看关于 SO 和其他地方的各种讨论,并且普遍的共识似乎是,如果从 R 函数返回多个不相似的数据结构,最好将它们返回为 list(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 函数返回单个数据结构,并且仍然能够像 $res->[0]、$res->[1] 一样从 Perl 访问每个单独的包还是$res->{'employees'}、$res->{'pets'}? 更新:我正在寻找 Perl 的 [[1, "foo", 3], [2, "bar"]] 甚至 [[1, "foo", 3], {a => 2, b => "bar"}] 的 R 等价物

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

【问题讨论】:

  • 由于 perl 是弱类型的,因此数字是否被字符串化并不重要。
  • 为问题添加了澄清附录。简而言之,虽然字符串化是次要问题,但它确实是一个问题。第一,我不能像使用数组或哈希那样使用索引来获取单独的数据结构,第二,所有额外的引号只会使工作变得混乱,给我的数据传输增加了脂肪。

标签: perl r postgresql plr


【解决方案1】:

我认为您在这里遇到了一些问题。第一个是在这种情况下你不能只返回一个数组,因为它不会通过 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 规划器可以理解的数据结构中,而这正是我认为您的示例中缺少的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 2017-03-26
    • 2012-11-12
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多