(testé sous Ubuntu/Jaunty)
D'après son site officiel, Perl est un puissant langage
orienté objet développé depuis 20 ans. En tout cas, il est très utilisé. Sous Ubuntu, il s'installe en quelques clics en utilisant Synaptic, par exemple. De nombreux modules sont disponibles pour des extensions à des usages particuliers.
Le projet R élabore un ensemble logiciel comportant un environnement d'exécution, un utilitaire de déboguage, l'accès à des fonctions système, la possibilité de lancer des scripts et, bien sûr, le très puissant langage R donnant accès
à des capacités étendues de calcul statistique et de représentation graphique. Il est souple, concis et clair.
Il s'installe également facilement, par exemple sous Ubuntu avec Synaptic.
Les utilisateurs de Perl ont la possibilité d'utiliser R sans quitter leur langage de développement. En effet, il existe un module de Perl qui assure une passerelle entre ce langage et R. Ce module répond au nom de Statistics::R et il permet, depuis l'intérieur d'un programme Perl, d'ouvrir une session R, d'y faire les traitements voulus et de refermer la session R. L'auteur peut cependant témoigner que l'emploi de ce module ne coule pas de source. La présente page, loin d'être exhaustive, vise modestement à donner quelques indications partielles mais utiles, qui prouvent au moins que "Si, Si, il est possible d'y arriver..." :-).
Déjà, sous Jaunty au moins, ce module n'est pas par défaut disponible dans Synaptic. L'auteur de cette page n'ayant pas trouvé les éventuels dépôts à configurer pour qu'il le devienne, il est passé par une installation directe par compilation, heureusement très simple.
Le module est disponible sur http://search.cpan.org/dist/Statistics-R/. Au moment de l'écriture de cette page, c'est : Statistics-R-0.08.tar.gz. Il faut l'enregistrer dans un dossier, ouvrir une console dans ce dossier et décomprimer le fichier par :
$ tar xvfz Statistics-R-0.08.tar.gz
On se place dans le dossier engendré par la décompression et l'on fait :
$ perl ./Makefile.PL
A cette commande, le système répond :
Checking if your kit is complete...
Looks good
Writing Makefile for Statistics::R
On enchaîne alors avec un classique
$ make
cp lib/Statistics/R/Bridge.pm blib/lib/Statistics/R/Bridge.pm
cp lib/Statistics/R.pm blib/lib/Statistics/R.pm
cp script/statistics-r.pl blib/script/statistics-r.pl
/usr/bin/perl "-MExtUtils::MY" -e "MY->fixin(shift)" blib/script/statistics-r.pl
Manifying blib/man3/Statistics::R::Bridge.3pm
Manifying blib/man3/Statistics::R.3pm
Suivi de :
$ sudo make install
[sudo] password for [USER]:
Installing /usr/local/share/perl/5.10.0/Statistics/R.pm
Installing /usr/local/share/perl/5.10.0/Statistics/R/Bridge.pm
Installing /usr/local/man/man3/Statistics::R.3pm
Installing /usr/local/man/man3/Statistics::R::Bridge.3pm
Installing /usr/local/bin/statistics-r.pl
Writing /usr/local/lib/perl/5.10.0/auto/Statistics/R/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod
Voilà, a priori, l'installation par défaut permet de travailler...
Le petit programme Perl myperl2R.pl suivant remplit un vecteur dans Perl puis le transmet à R qui le trace et met le graphique dans un fichier pdf :
#!/usr/local/bin/perl -w
use strict;
use Statistics::R; # Installer le module auparavant !!
#
my $chemin = "~/Documents/Zemporer/Perl2R/sortie.pdf" ; # mon chemin local pour faire le test
my @intervalles = (360,-112,350,350,-10,-112,-112,-120,-112,-112,-10,360); # initialisation d'un vecteur pour test
# Ci-dessous les impressions pour deboguage
print $chemin."\n";
my $valeur ;
foreach $valeur (@intervalles) { print ($valeur."\n") } ;
# ============================================
my $R = Statistics::R->new(); # Definit la session R
$R->startR; # Ouvre la session R
# vect <-c(1,2,3,4,5,6) mis dans qq ci-dessous a la place de $loadvect fonctionne
# my $loadvect='vect <-'.@intervalles ; # cette ecriture transmet la longueur du vecteur au lieu du contenu du vecteur
# my $loadvect="vect <- c (".@intervalles.")" ; # cette ecriture transmet aussi la longueur du vecteur
my $loadvect="vect <- c (". join(",", @intervalles) .")" ; # Cette formulation fonctionne car elle introduit les virgules indispensables
$R->send(qq`
$loadvect
pdf("$chemin")
plot(vect)
dev.off()
`); # Envoie dans la session R la suite d'instructions (les placer dans un seul send!)
$R->stopR(); # Ferme la session R
produit d'une part à la console le dialogue suivant :
$ perl ./myperl2R.pl
~/Documents/Zemporer/Perl2R/sortie.pdf
360
-112
350
350
-10
-112
-112
-120
-112
-112
-10
360
et d'autre part le fichier ~/Documents/Zemporer/Perl2R/sortie.pdf
Le programme Perl myperl2R2.pl remplit un vecteur dans Perl puis le transmet à R. R le trace, met le graphique dans un fichier png, imprime une sortie qui est reprise dans une variable Perl pour affichage sous Perl.
Le dialogue :
$ perl ./myperl2R2.pl
== Bonjour. Le programme Perl commence...
Le fichier attendu est ~/Documents/Zemporer/Perl2R/sortie.png, pour montrer graphiquement le vecteur suivant :
360
-112
350
350
-10
-112
-112
-120
-112
-112
-10
360
La session R commence...
Le graphique est en cours, merci de votre patience...
La session R est finie.
....> R a dit :
360 -112 350 350 -10 -112 -112 -120 -112 -112 -10 360
Fin de programme Perl.
Le fichier png :.