возвращение нескольких разнородных структур данных из функции R в PL / R - PullRequest
1 голос
/ 14 января 2012

Я смотрел различные дискуссии здесь о SO и других местах, и общий консенсус кажется, что если кто-то возвращает несколько не похожих структур данных из функции R, их лучше всего вернуть как list(a, b), а затем получить доступпо индексам 0 и 1 и так далее.За исключением того, что при использовании функции R через PL / R внутри Perl-программы функция 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 : Я ищу R эквивалент эквивалента Perl [[1, "foo", 3], [2, "bar"]] или даже [[1, "foo", 3], {a => 2, b => "bar"}]

addendum : Основная идея моего вопроса - как вернуть несколькоразнородные структуры данных из функции PL / R.Однако строковая спецификация, как отмечено выше, и вторичная, также проблематичны, потому что я преобразую данные в JSON, а все эти дополнительные кавычки просто добавляют к бесполезным данным, передаваемым между сервером и пользователем.

1 Ответ

0 голосов
/ 25 марта 2013

Я думаю, у вас есть несколько проблем здесь.Во-первых, вы не можете просто вернуть массив в этом случае, потому что он не пройдет проверку массивов в PostgreSQL (массивы должны быть симметричными, одного и того же типа и т. Д.).Помните, что если вы вызываете PL / R из PL / Perl через интерфейс запроса, ограничения типа 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, и это то, чего, мне кажется, не хватает в вашем примере.

...