2012-01-14 1 views
1

J'ai examiné diverses discussions ici sur SO et d'autres endroits, et le consensus général semble que si l'on renvoie plusieurs structures de données non similaires à partir d'une fonction R, ils sont mieux retournés comme list(a, b) et ensuite accédés par les index 0 et 1 et ainsi de suite. Sauf, lors de l'utilisation d'une fonction R via PL/R dans un programme Perl, la fonction R list aplatit la liste et même les nombres. Par exemplerenvoyant plusieurs structures de données dissemblables de la fonction R dans PL/R

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 

L'utilisation d'un data.frame ne fonctionne pas parce que les deux tableaux retournés ne sont pas symétriques, et la fonction croassements.

Alors, comment puis-je retourner une seule structure de données à partir d'une fonction R qui est composée d'un ensemble arbitraire de structures de données imbriquées, et toujours être en mesure d'accéder à chaque paquet individuel de Perl comme un simple $res->[0], $res->[1] ou $res->{'employees'}, $res->{'pets'}? mise à jour: Je cherche un equiv R de Perl [[1, "foo", 3], [2, "bar"]] ou même [[1, "foo", 3], {a => 2, b => "bar"}]

addendum: Le principal objectif de ma question est de savoir comment retourner plusieurs structures de données différentes d'une fonction PL/R. Cependant, la stringification, comme indiqué ci-dessus, et secondaire, est également problématique car je convertis les données en JSON, et toutes ces citations supplémentaires s'ajoutent simplement aux données inutiles transférées entre le serveur et l'utilisateur.

+0

Puisque perl est faiblement typé, cela n'aura aucune importance si les nombres sont stringifiés. – Ilion

+0

Ajout d'un addenda clarifiant à la question. Brièvement, alors que la stringification est un problème secondaire, c'est effectivement un problème. Premièrement, je ne peux pas obtenir les structures de données séparées à l'aide d'index comme je le ferais avec un tableau ou un hachage, et deux, toutes les citations supplémentaires viennent gonfler les travaux, ajoutant de la graisse à mon transfert de données. – punkish

Répondre

0

Je pense que vous avez quelques problèmes ici. La première est que vous ne pouvez pas retourner un tableau dans ce cas, car il ne passera pas les contrôles de tableau de PostgreSQL (les tableaux doivent être symétriques, tous du même type, etc.). N'oubliez pas que si vous appelez PL/R à partir de PL/Perl via une interface de requête, les contraintes de type PostgreSQL vont poser problème.

Vous avez plusieurs options.

Vous pouvez renvoyer setof text [] avec un type de données par ligne.

vous pouvez retourner une sorte de données structurées en utilisant des structures PostgreSQL comprend, comme:

CREATE TYPE ab AS (
    a text, 
    b text 
); 

CREATE TYPE r_retval AS (
    labels text[], 
    my_ab ab 
); 

Cela vous permettra de retourner quelque chose comme:

{labels => [1, "foo", 3], ab => {a => 'foo', b => 'bar'} } 

Mais en tout cas, vous devez mettre dans une structure de données que le planificateur PostgreSQL peut comprendre et c'est ce qui me manque dans votre exemple.

Questions connexes