Chapitre 6. Programmation en R
261
dynamiques). Une DLL contient des fonctions qui pourront ˆ etre appel´ ees pendant l’ex´ ecution d’un programme, sans que celles-ci soient incluses dans son
ex´ ecutable. Ici, il s’agit du fichier combn.dll (qui ne contient qu’une seule fonction) qui sera cr´ e´ e un peu plus loin.
Les fonctions .C() et .Fortran() (qui renvoient une liste) permettent respectivement de passer des valeurs depuis R vers une fonction C/C++ ou Fortran
puis de r´ ecup´ erer le r´ esultat de ces derni` eres. Il faut utiliser les instructions
as.integer(), as.double() ou as.character() pour d´ eclarer respectivement
dans R des objets constitu´ es de valeurs enti` eres, de valeurs d´ ecimales (num´ eriques) ou de chaˆ ınes de caract` eres, afin qu’elles soient « re¸ cues » correctement
par l’un des arguments de la fonction C/C++ ou Fortran.
Pour une fonction C/C++, tous les arguments devront ˆ etre des pointeurs ; par
exemple des pointeurs d’entiers (int * ), de r´ eels (double * ) ou encore pointeurs de pointeurs de caract` eres (char ** ). Le tableau 6.1 donne les ´ equivalents
entre les types dans R, C/C++ et Fortran.
Table 6.1 – Conventions sur les types des arguments. Tapez ?.Fortran pour
plus de d´ etails.
R
C/C++
Fortran
integer
int *
INTEGER
numeric
double *
DOUBLE PRECISION
numeric
float *
REAL
complex
Rcomplex * DOUBLE COMPLEX
logical
int *
integer
character char **
CHARACTER * 255
list
SEXP *
non autoris´ e
autre type SEXP
non autoris´ e
Attention
Contrairement ` a R, o` u il est tr` es facile d’obtenir la longueur d’un vecteur x au moyen de l’instruction length(x), en C/C++ il n’est pas possible
de connaˆ ıtre la longueur de x. Il peut alors parfois s’av´ erer n´ ecessaire de
fournir `
a la fonction .C() ` a la fois le vecteur x et sa longueur, par exemple
de la fa¸ con suivante pour une hypoth´ etique fonction nomm´ ee fonctionC :
x <- c(1.2,0.7,3,2,4,1,0.9)
.C("fonctionC",as.double(x),as.integer(length(x)))
261
dynamiques). Une DLL contient des fonctions qui pourront ˆ etre appel´ ees pendant l’ex´ ecution d’un programme, sans que celles-ci soient incluses dans son
ex´ ecutable. Ici, il s’agit du fichier combn.dll (qui ne contient qu’une seule fonction) qui sera cr´ e´ e un peu plus loin.
Les fonctions .C() et .Fortran() (qui renvoient une liste) permettent respectivement de passer des valeurs depuis R vers une fonction C/C++ ou Fortran
puis de r´ ecup´ erer le r´ esultat de ces derni` eres. Il faut utiliser les instructions
as.integer(), as.double() ou as.character() pour d´ eclarer respectivement
dans R des objets constitu´ es de valeurs enti` eres, de valeurs d´ ecimales (num´ eriques) ou de chaˆ ınes de caract` eres, afin qu’elles soient « re¸ cues » correctement
par l’un des arguments de la fonction C/C++ ou Fortran.
Pour une fonction C/C++, tous les arguments devront ˆ etre des pointeurs ; par
exemple des pointeurs d’entiers (int * ), de r´ eels (double * ) ou encore pointeurs de pointeurs de caract` eres (char ** ). Le tableau 6.1 donne les ´ equivalents
entre les types dans R, C/C++ et Fortran.
Table 6.1 – Conventions sur les types des arguments. Tapez ?.Fortran pour
plus de d´ etails.
R
C/C++
Fortran
integer
int *
INTEGER
numeric
double *
DOUBLE PRECISION
numeric
float *
REAL
complex
Rcomplex * DOUBLE COMPLEX
logical
int *
integer
character char **
CHARACTER * 255
list
SEXP *
non autoris´ e
autre type SEXP
non autoris´ e
Attention
Contrairement ` a R, o` u il est tr` es facile d’obtenir la longueur d’un vecteur x au moyen de l’instruction length(x), en C/C++ il n’est pas possible
de connaˆ ıtre la longueur de x. Il peut alors parfois s’av´ erer n´ ecessaire de
fournir `
a la fonction .C() ` a la fois le vecteur x et sa longueur, par exemple
de la fa¸ con suivante pour une hypoth´ etique fonction nomm´ ee fonctionC :
x <- c(1.2,0.7,3,2,4,1,0.9)
.C("fonctionC",as.double(x),as.integer(length(x)))
