Incorporation de code C dans un programme R

Transcription

Incorporation de code C dans un programme R
Programmation en R :
incorporation de code C et création de packages1
Sophie Baillargeon
Université Laval
Rédigé en février 2006, révisé en juin 2007.
Table des matières
1 Introduction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2 Préalables informatiques . . . . . . . . . . . . . . . .
2.1 Installation de programmes. . . . . . . . . . . . . .
2.2 Détermination du PATH . . . . . . . . . . . . . . .
2.3 Définition de la variable d’environnement TMPDIR
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
4
3 Incorporation de code C en R . . . . . . . . . . . . .
3.1 Particularités du code C . . . . . . . . . . . . . .
3.2 Démarche d’incorporation de code C en R . . . . .
3.2.1 Compilation du code C . . . . . . . . . . .
3.2.2 Chargement en R du code C compilé . . . .
3.2.3 Appel en R des fonctions programmées en C
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
6
6
7
7
4 Packages R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 Installation et utilisation d’un package R . . . . . . . . . . . . . . . . . . . .
4.2 Création d’un package R . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Élaboration des fichiers sources . . . . . . . . . . . . . . . . . . . . . .
A - Création du répertoire de base avec la fonction « package.skeleton » .
B - Ajout de fichiers pour l’incorporation de code C, C++ ou FORTRAN
C - Modification des fichiers d’information sur le package . . . . . . . .
4.2.4 Vérification et construction du package . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
9
9
9
11
12
12
5 Solution à différents messages d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
6 Utilisation de WinEdt comme éditeur de code R
. . . . . . . . . . . . . . . . . . . . .
17
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
Bibliographie
1
Remarque : Le fonctionnement des techniques présentées dans ce document n’est pas garanti pour des versions de R
antérieures à la version 2.2.0. Pour éviter tout problème et perte de temps, assurez-vous d’avoir la version de R la plus
récente (téléchargeable sur le site internet http://www.r-project.org/).
1 Introduction
Pourquoi R et non S-PLUS ?
S est un langage de programmation flexible de calculs statistiques et de production de
graphiques. Pour utiliser ce langage, deux implémentations sont offertes : S-PLUS et R. S-PLUS est
un logiciel commercial distribué par la compagnie Insightful et R est un logiciel libre. Bien que R
ait une interface moins conviviale que S-PLUS et que la gestion de jeux de données y soit moins
intuitive, il possède de nombreux avantages sur S-PLUS (Hornik, 2007). Étant donné que R est
gratuit, il assure à un statisticien qui l’utilise pour illustrer ses recherches que ses résultats sont
reproductibles par quiconque. De plus, R a maintes fois prouvé être plus rapide que S-PLUS pour
effectuer certains calculs et il possède plus d’options graphiques. De plus en plus de chercheurs en
statistique tournent le dos à S-PLUS au dépend de R. La communauté d’utilisateurs et de
développeurs R est grandissante et très active (http://www.r-project.org/). En conséquence, le
logiciel est en constante évolution : des mises à jour majeures sont effectuées environ tous les 6
mois, les bugs sont identifiés et corrigés rapidement et plusieurs packages sont disponibles en sus.
Ces packages, souvent élaborés par des experts dans leur domaine, permettent de faire les analyses
les plus diverses en R. En outre, l’aide de R et ses manuels d’utilisateur sont très complets et le
support à l’utilisateur sous la forme de listes courriels est efficace. Bref, R est un logiciel libre bien
documenté, stable et sûr. Pour toutes ces raisons, ce document traite de programmation en R et non
en S-PLUS. Sachez cependant qu’étant donné que R et S-PLUS sont des dialectes du même
langage, le langage S, toutes les techniques décrites ici sont aussi réalisables avec S-PLUS à
quelques différences près dans la méthodologie.
Quel objectif est visé par ce document ?
Ce document décrit la mise en œuvre de certaines techniques qui exploitent des possibilités
avancées de programmation en R. L’objectif du document est de rendre le lecteur capable d’intégrer
du code C dans des programmes R et de créer des packages R. L’incorporation de code C en R
permet d’augmenter la vitesse d’exécution de certains programmes et un package regroupe, organise
et documente des fonctions R, les rendant ainsi plus facilement utilisables et partageables. Ces
techniques sont présentées pour les utilisateurs de R sur Linux et sur Windows.
Que contient ce document et comment se structure-t-il ?
Le document comporte cinq sections, mise à part l’introduction. Premièrement, les préalables
informatiques sont décrits à la section 2. Dans cette section, les utilisateurs de R sur Windows
trouveront des informations concernant la préparation de leur ordinateur afin de pouvoir mettre en
oeuvre les techniques présentées. Ensuite, il est décrit point par point, aux sections 3 et 4, comment
intégrer du code C en R et comment créer un package R. Ces deux sections forment le cœur du
document. À la section 5, vous trouverez une liste de problèmes possibles en cours de travail et
leurs solutions. Finalement, une mention à propos de l’utilisation du logiciel WinEdt en tant
qu’éditeur de code R se trouve à la section 6. Notons qu’une présentation pdf (Baillargeon, 2006)
complète le document en illustrant de façon encore plus concrète les méthodologies détaillées ici.
2
2 Préalables informatiques
Les ordinateurs Linux du Département de mathématiques et de statistique possèdent tous les
logiciels nécessaires à l’appel de code C en R et à la création d’un package R. Par contre, un
ordinateur sur plateforme Windows n’a pas, par défaut, tous les programmes requis pour mettre en
œuvre ces techniques. Voici comment préparer son ordinateur Windows à la création de packages et
à l’appel code C en R.
2.1 Installation de programmes
En plus du logiciel R, on doit installer les programmes utilitaires suivants si on ne les a pas
déjà (R Team, 2007a, annexe E ; http://www.murdoch-sutherland.com/Rtools/) :
Installations obligatoires :
• Perl : http://www.activestate.com/Products/ActivePerl/Download.html
• Rtools : http://www.murdoch-sutherland.com/Rtools/installer.html
- Le fichier exécutable Rtools.exe téléchargeable à cette adresse installe quelques outils
Unix pour R ainsi que les compilateurs C, C++ et FORTRAN de MinGW. Certains des
outils R utilisent des DLL de Cygwin. Si vous avec déjà une version de Cygwin installée
sur votre ordinateur, veuillez lire le fichier Rtools.txt à l’adresse ci-dessus et suivre les
instructions.
Installations optionnelles :
• HTML Help Workshop : http://msdn.microsoft.com/library/enus/htmlhelp/html/hwmicrosofthtmlhelpdownloads.asp
- Permet de produire de la documentation en format .chm si désiré.
• Un compilateur LaTeX (un bon compilateur gratuit est MiKTeX téléchargeable sur le site
web http://www.miktex.org/)
- Permet de produire de la documentation LaTeX, dvi et pdf si désiré.
2.2 Détermination du PATH
Afin que l’ordinateur reconnaisse les commandes nécessaires à la création d’un package ou
l’incorporation du code C en R, son PATH doit contenir le répertoire « bin » de Rtools, Perl,
MinGW, R et LaTeX ainsi que le répertoire de Html Help Workshop. Il n’est pas recommandé de
modifier le PATH de son ordinateur de façon permanente car cela pourrait ralentir un peu
l’ordinateur et même causer le non fonctionnement de certains programmes. Il est plutôt
recommandé de modifier le PATH chaque fois que nous ouvrons une fenêtre de commandes dans le
but d’exécuter des commandes R. Pour ce faire, une façon simple et efficace est de créer un fichier
«.bat» contenant la nouvelle définition du PATH. Ce fichier sera appelé à l’ouverture d’une fenêtre
de commandes simplement en tapant le nom complet du fichier incluant son chemin d’accès. Par
exemple, si le fichier est nommé Rpath.bat et placé dans le répertoire « C:\ », à l’ouverture d’une
fenêtre de commande il faudrait taper la commande suivante pour définir le PATH :
C:\Rpath.bat
3
Pour créer ce fichier, il suffit d’utiliser un éditeur de texte ASCII, tel que le Bloc-notes. Le fichier
contiendra uniquement la ligne suivante :
PATH=C:\Rtools\bin;C:\Perl\bin;C:\Rtools\MinGW\bin;C:\PROGRA~1\R\R-2.5.0\bin;
C:\PROGRA~1\MIKTEX~1.6\miktex\bin;C:\PROGRA~1\HTMLHE~1;
C:\WINDOWS;C:\ WINDOWS \system32
(à adapter selon l’emplacement des répertoires sur son ordinateur). La position de ces répertoires
dans le PATH importe peu, à l’exception du répertoire de Rtools qu’il faut placer au tout début car
certains fichiers du Rtools ont des noms usuels qui pourraient entrer en conflit avec d’autres fichiers
dans le PATH. Il est très important de ne pas laisser traîner d’espaces avant et après les pointsvirgules. En fait, il vaut mieux que le PATH ne contienne aucun espace, c’est pourquoi dans
l’exemple ci-dessus les répertoires contenant des espaces, tel « Program Files » ont été remplacé par
leur forme courte (trouvée par la commande « dir /x » dans une fenêtre de commandes). Les
répertoires de Windows ont été inclus dans le PATH pour s’assurer que certaines commandes de
base soient toujours accessibles.
2.3 Définition de la variable d’environnement TMPDIR
Pour certaines versions de Windows, il sera nécessaire de définir la variable d'environnement
TMPDIR en fonction de l’emplacement du répertoire de fichiers temporaires de son ordinateur. Par
exemple, sur Windows XP, il faut aller dans :
« Menu démarrer Æ Panneau de configuration Æ Système Æ Avancé »
et cliquer sur « Variables d’environnement ». Dans la section « Variables système », cliquer sur
« Nouveau » et entrer les informations suivantes :
Nom de la variable = « TMPDIR » , Valeur de la variable = « C:\WINDOWS\TEMP »).
Remarque : Le problème réglé par cette étape peut aussi être réglé en créant un répertoire
« C:\temp » sur son ordinateur.
L’incorporation de code C en R sur Windows exige seulement l’installation de Perl, Rtools
et MinGW, ainsi que l’ajout des répertoires « bin » de ces logiciels en plus de celui de R au Path de
votre ordinateur s’ils ne s’y trouvent pas déjà. Notez également que pour créer un package ne
contenant pas de code en langage C, C++ et FORTRAN, le compilateur MinGW n’est pas requis.
Mentionnons finalement que si vous avez un compilateur tel Visual C++ ou Borland C++, il
est possible de vous en servir afin de créer le fichier .dll dont R a besoin pour incorporer du code C.
Pour ce faire, vous devez suivre les instructions présentes dans le fichier README.packages se
trouvant dans le répertoire de R de votre ordinateur (ex. : C:\Program Files\R\R-2.5.0). Par contre, il
est plus simple d’installer MinGW. En outre, pour créer un package R contenant du code C vous
avez besoin de MinGW.
4
3 Incorporation de code C en R
Cette section résume la marche à suivre afin d’incorporer du code C dans un programme R.
Pour ce faire, on utilise une fonction R qui sert d’interface pour du code C compilé préalablement
chargé en R. L’utilisation de fonctions écrites en C dans un programme R s’effectue en trois étapes :
1) Compiler le code C afin de créer un objet partagé (fichier .so) si on travaille sur Linux ou
une librairie dynamique (fichier .dll) si on travaille sur Windows ;
2) Charger en R l’objet partagé ou la librairie dynamique créé à l’étape précédente avec la
fonction « dyn.load » ;
3) Appeler en R les fonctions créées dans le code C avec une fonction d’interface.
Dans ce document, seule la fonction d’interface .C est décrite. Il existe deux autres fonctions
d’interface R/C : .Call et .External. Ces interfaces sont plus puissantes car elles permettent
d’utiliser des objets R dans le code C, par contre elles sont plus compliquées d’utilisation que .C. Si
la tâche à programmer en C est assez simple et ne requière aucun appel de code R, il est conseillé
d’utiliser l’interface .C.
Notons que du code C++ peut aussi être incorporé avec l’interface .C et du code FORTRAN
peut être appelé grâce à une autre interface, la fonction .Fortran. Pour plus d’informations
concernant l’incorporation de code C, C++ ou FORTRAN en R, la meilleure référence est le manuel
Writing R Extensions (R Team, 2007b, chapitre 4).
3.1 Particularités du code C
Le code C incorporé en R doit respecter les propriétés suivantes (Peng et Leeuw, 2002) :
• Les fonctions C appelées en R doivent être de type « void ». Elles doivent retourner les résultats
des calculs par leurs arguments.
• Les arguments passés aux fonctions C sont des pointeurs à un nombre ou à un tableau. Il faut
donc correctement déréférencer les pointeurs dans le code C afin d’obtenir la valeur d’un élément
dont l’adresse est contenue dans le pointeur. On déréférence un pointeur en ajoutant «*» devant
ce pointeur.
• Il est préférable d’inclure dans tout fichier contenant du code C à être appelé en R le fichier d’entête R.h en ajoutant au début du fichier de code C la ligne :
#include <R.h>
De plus, il est possible d’utiliser en C certaines fonctions mathématiques R en incluant le fichier
d’en-tête Rmath.h dans votre fichier de code C par la ligne :
#include <Rmath.h>
Par exemple, on peut utiliser les fonctions de distribution telles dnorm, pnorm, qnorm et rnorm.
Le document Writing R Extensions à la section 5.7 (R team, 2007b) liste les fonctions utilisables.
• Le fichier contenant le code C doit porter l’extension «.c».
5
Voici un exemple, tiré du document An introduction to the .C Interface to R (Peng et Leeuw,
2002), d’un code C très simple qui détient toutes ces propriétés. Ce programme affiche n fois à
l’écran la chaîne de caractères « Hello, world! ». Le fichier hello.c contenant le code C a l’allure
suivante :
#include <R.h>
void hellofct(int *n)
{
int i;
for(i=0; i < *n; i++) {
Rprintf("Hello, world!\n");
}
}
3.2 Démarche d’incorporation du code C en R
Détaillons maintenant les trois étapes présentées dans l’introduction afin d’incorporer du
code C en R. Notons d’abord que la démarche d’incorporation de C en R est la même peu importe
la plateforme informatique avec laquelle on travaille à la condition que tous les logiciels nécessaires
sont installés sur l’ordinateur. Afin d’illustrer la démarche, l’exemple du programme « Hello, world!
» sera utilisé à chaque étape. Supposons pour cet exemple que l’on travaille sur une plateforme
Windows XP et que le fichier hello.c se trouve dans le répertoire « C:\Mes documents ».
3.2.1 Compilation du code C
La première étape consiste à compiler le code C afin de créer un objet partagé (fichier .so) si
on travaille sur Linux ou une librairie dynamique (fichier .dll) si on travaille sur Windows. On
effectue cette étape dans une fenêtre terminal sur Linux ou dans une fenêtre de commandes sur
Windows. On se place d’abord dans le répertoire où se trouve le fichier contenant le code C, puis on
tape la commande :
R CMD SHLIB nomfichier.c
L’objet partagé ou la librairie dynamique créé par cette commande se nommera nomfichier.so ou
nomfichier.dll. Pour en savoir plus sur les options de la fonction « R CMD SHLIB », tapez la
commande :
R CMD SHLIB --help
EXEMPLE :
On ouvre une fenêtre de commande (accessible par « Menu démarrer Æ Programmes Æ
Accessoires Æ Invite de commandes »). On tape la commande « cd C:\Mes documents » afin de se
placer dans le bon répertoire, puis on tape « R CMD SHLIB hello.c » pour compiler le code C.
6
3.2.2 Chargement en R du code C compilé
Il faut ensuite charger en R l’objet partagé ou la librairie dynamique créé à l’étape
précédente avec la fonction « dyn.load ». Pour ce faire, on ouvre R et on se place dans le répertoire
courant contenant le fichier de code C compilé .so ou .dll (par le menu « Fichier Æ Changer le
répertoire courant » ou par la commande « setwd »). On charge ensuite ce code compilé par la
commande suivante (le nom du fichier doit obligatoirement être entre guillemets) :
> dyn.load("nomfichier.so")
ou
> dyn.load("nomfichier.dll")
On peut aussi utiliser le nom complet du fichier incluant son chemin d’accès pour le charger en R.
On évite ainsi de devoir changer le répertoire courant.
On peut faire un test pour s’assurer que les fonctions C ont été correctement chargées en R.
Pour ce faire, on utilise la fonction « is.loaded » avec, en argument, le nom entre guillemet d’une
fonction C. Si cette commande ne retourne pas « TRUE » le premier point de la section 5 pourrait
vous aider à régler le problème.
EXEMPLE :
On ouvre R puis on tape la commande « dyn.load("C:/Mes documents/hello.dll") ». Notez
qu’en R les chemins d’accès doivent être fournis en utilisant le symbole « / » ou « \\ » entre les
répertoires plutôt que « \ ».
3.2.3 Appel en R des fonctions programmées en C
On peut finalement appeler en R les fonctions créées dans le code C avec la fonction
d’interface .C. On utilise cette fonction de la façon suivante :
> .C("nomfonction",argument1,argument2,….)
Le nom de la fonction doit obligatoirement être entre guillemets. Il est préférable de s’assurer que
chaque argument passé à la fonction C est du bon type en appliquant aux arguments une fonction
telle « as.integer », « as.double », « as.character » ou « as.logical ». De plus, pour rendre les appels à
la fonction C plus conviviaux, il est conseillé de créer une fonction R qui enveloppe l’appel à la
fonction C.
EXEMPLE :
On se crée une fonction R qui appelle la fonction C par le programme R suivant :
Hello <- function(n){
.C("hellofct",as.integer(n))
}
On peut ensuite utiliser cette fonction pour afficher disons 5 fois « Hello, world! » par la commande:
> Hello(5)
7
D’autres exemples simples d’incorporation de code C en R sont présentés dans le document
An introduction to the .C Interface to R de Peng et Leeuw (2002).
4 Packages R
La meilleure façon de partager des fonctions R que l’on a programmées consiste à les mettre
dans un package. Un package R se présente sous la forme d’un fichier compressé qui regroupe des
fonctions, les documente et peut contenir des jeux de données servant à illustrer l’utilisation des
fonctions. Ainsi, tout y est pour faciliter la compréhension de l’utilisation les fonctions. On peut
rendre un package disponible à tous en le plaçant sur un site web personnel ou, mieux encore, en le
mettant sur le CRAN, le réseau officiel de distribution de code et de documentation R (http://cran.rproject.org). On retrouve en date d’aujourd’hui (juin 2007) près de 1068 packages sur le CRAN.
La source officielle d’information concernant la création de packages R est le manuel
Writing R Extensions (R Team, 2007b, chapitre 4). Certaines pages web sont aussi de bonnes
références, moins complètes mais plus vulgarisées :
http://www.maths.bris.ac.uk/~maman/computerstuff/Rhelp/Rpackages.html
http://zoonek2.free.fr/UNIX/48_R/02.html#15.
Cette section tente de résumer et de présenter simplement les informations provenant de ces
différentes sources.
4.1 Installation et utilisation d’un package R
Avant de savoir comment créer des packages R, il faut savoir comment les utiliser. Voici
comment faire en fonction de la plateforme informatique sur laquelle on travaille.
Sur Windows : Un package utilisable sur Windows possède l’extension « .zip ». Il est constitué de
fichiers binaires précompilés. Pour l’utiliser, il faut effectuer les deux étapes suivantes :
1) Installer le package (en R) :
Ouvrir R, aller dans le menu « Packages Æ Installer le(s) package(s) depuis des fichiers zip »
puis sélectionner le fichier zip nompackage_version.zip contentant le package. Ce que R fait
alors est simplement de dézipper le fichier zip et de placer son contenu dans le répertoire
« C:\Program Files\R\R-2.5.0\library ».
2) Charger le package (en R) :
Aller dans le menu « Packages Æ Charger le package » puis sélectionner le package ou taper la
commande :
> library(nompackage)
8
Sur Linux : Un package utilisable sur Linux possède l’extension « .tar.gz ». Il est composé des
fichiers sources du package. Afin de l’utiliser sur un des ordinateurs du département, il faut :
1) Installer le package (dans une fenêtre terminal) :
Ouvrir une fenêtre terminal, se placer dans le répertoire contenant le fichier
nompackage_version.tar.gz et taper la commande :
R CMD INSTALL --library=/mat/usr/sbaillar/.R/library nompackage_version.tar.gz
La localisation de la librairie est évidemment à modifier en mettant votre code d’utilisateur
plutôt que le mien. On peut aussi se créer un répertoire qui constituera la librairie R (ex. :
/mat/usr/sbaillar/librairieR/).
2) Charger le package (en R) :
Ouvrir R et taper la commande :
> library(nompackage , lib.loc="/mat/usr/sbaillar/.R/library")
4.2 Création d’un package R
Pour créer un package R, il faut élaborer les fichiers sources, puis vérifier et construire le
package. L’élaboration des fichiers sources se décompose en 3 étapes. Il faut d’abord créer le
répertoire de base du package avec la fonction « package.skeleton », ensuite y ajouter des fichiers si
une partie de la programmation du package est en langage C, C++ ou FORTRAN, puis modifier les
fichiers dits d’information. En outre, l’étape de la construction du package dépend de la plateforme
informatique sur laquelle on travaille et de la plateforme à laquelle est destinée le package.
4.2.1 Élaboration des fichiers sources
Les fichiers sources d’un package doivent respecter une certaine structure. Notamment, ces
fichiers doivent être localisés dans un répertoire portant le nom du package. Ce répertoire doit
obligatoirement contenir un sous répertoire nommé ‘man’ pour la documentation et un autre nommé
‘R’ pour le code R. De plus, il doit contenir un fichier nommé ‘DESCRIPTION’ contenant des
informations bien spécifiques. Si votre package contient des jeux de données, un sous répertoire
‘data’ est également requis et, finalement, il faut un sous répertoire ‘src’ si des fonctions sont écrites
dans le langage C, C++ ou FORTRAN. Pour simplifier la création des répertoires contenant les
fichiers sources, on peut utiliser la fonction « package.skeleton » afin de créer un gabarit de base
pour le package, puis ajouter si nécessaire et modifier des fichiers du répertoire.
A - Création du répertoire de base du package avec la fonction « package.skeleton »
a) Ouvrir R et se positionner dans le répertoire courant qui contiendra la package.
b) Créer toutes les fonctions et les jeux de données à inclure dans le package. Il est bien de
rédiger un programme (aussi appelé script) R qui crée tous ces objets. Ensuite, on peut lire
ce programme avec la commande :
9
> source("chemin_d’accès_approprié/programme.R")
c) Utiliser la fonction « package.skeleton » qui crée les répertoires et les fichiers de base avec
la commande :
> package.skeleton(list=c("fct1","fct2",….,"data1","data2",…), name="nompackage")
où « fct1 », « fct2 », etc. sont les fonctions à inclure dans le package et « data1 », « data2 »,
etc. sont les jeux de données à mettre dans le package. Si on a omis de se positionner dans
le répertoire courant qui contiendra la package, on peut aussi spécifier ce répertoire par
l’argument « path » de la fonction « package.skeleton ».
Æ Si le package doit contenir un grand nombre d’objets, il vaut mieux remplacer la dernière étape
par les deux étapes suivantes :
c) Laisser dans notre environnement de travail seulement les fonctions et les jeux de données
à inclure dans le package. Commandes R utiles à cette étape :
> ls()
# Pour avoir la liste de tous les objets dans l’environnement de travail
> rm(nomobject) # Pour enlever l’objet « nomobject » de l’environnement de travail
> rm(list = ls()) # Pour enlever tous les objets de l’environnement de travail 2
d) Utiliser la fonction « package.skeleton » sans spécifier la liste des objets à mettre dans le
package. Par défaut, tous les objets présents dans l’environnement de travail sont inclus.
> package.skeleton(name="nompackage")
EXEMPLE :
On ouvre R puis on va dans « Fichier Æ Changer le répertoire courant » et on inscrit
« C:\Mes documents\PackageR ». On crée nos fonctions et nos jeux de données :
>
>
>
>
f <- function(x,y) x+y
g <- function(x,y) x-y
d <- data.frame(a=1, b=2)
e <- rnorm(1000)
On crée le package par la commande :
> package.skeleton(list=c("f","g","d","e"), name="monpkg")
Ou encore, on crée un fichier nommé programme.R dans le répertoire qui contiendra le package. Ce
fichier a l’allure suivante :
2
Remarque : Lors de l’ouverture d’une session en S-Plus, l’environnement de travail contient tous les objets créés lors
des sessions passées dans le même répertoire. En R c’est différent. Lors de l’ouverture d’une nouvelle session,
l’environnement de travail est vide. Par contre, on peut conserver des objets créés lors d’une session en sauvant une
image de la session. On peut ensuite retrouver ces objets lors d’une nouvelle session R en chargeant l’environnement de
travail de l’image sauvée (« Fichier Æ Charger l’environnement de travail… » ou avec la fonction « load »).
10
f <- function(x,y) x+y
g <- function(x,y) x-y
d <- data.frame(a=1, b=2)
e <- rnorm(1000)
Puis, on exécute les commandes R suivantes :
> rm(list = ls())
> source("programme.R")
> package.skeleton(name="monpkg")
On peut vérifier dans un gestionnaire de fichiers que la fonction « package.skeleton » a créé
les répertoires et les fichiers suivants :
• .\nompackage
• .\nompackage\data
• .\nompackage\data\data1.rda
• .\nompackage\data\data2.rda
…
• .\nompackage\man
• .\nompackage\man\nompackage-package.Rd
• .\nompackage\man\fct1.Rd
• .\nompackage\man\fct2.Rd
…
• .\nompackage\man\data1.Rd
• .\nompackage\man\data2.Rd
…
• .\nompackage\R
• .\nompackage\R\fct1.R
• .\nompackage\R\fct2.R
…
• .\nompackage\Read-and-delete-me
• .\nompackage\DESCRIPTION
Chaque fichier du sous répertoire ‘.\nompackage\data’ est un jeu de données et les fichiers du sous
répertoire ‘.\nompackage\R’ contiennent les programmes R pour créer les fonctions. Dans le sous
répertoire ‘.\nompackage\man’, on retrouve des fichiers qui serviront à construire la documentation.
B - Ajout de fichiers pour l’incorporation de code C, C++ ou FORTRAN :
Pour inclure du code C, C++ ou FORTRAN dans un package, il faut ajouter aux fichiers du
package le répertoire ‘.\nompackage\src’ et y sauver un fichier « .c » ou « .f » contenant le code. De
plus, il faut ajouter un fichier dans le répertoire ‘.\nompackage\R’ contenant la fonction suivante :
.First.lib <-function (lib, pkg) {
library.dynam("nompackage", pkg, lib)
}
Ce fichier est souvent nommé zzz.R, mais le nom du fichier importe peu tant qu’il porte l’extension
« .R ». Grâce au code dans ce fichier, le fichier dll du code C, C++ ou FORTRAN compilé est
chargé en R en même temps que le package. L’utilisateur du package n’a donc pas besoin de charger
le fichier dll avec la fonction « dyn.load ». D’ailleurs aucune commande « dyn.load » ne doit
apparaître dans le code R du package. De plus, dans le code R, il faut modifier tous les appels des
11
fonctions .C, .Fortran, .Call ou .External en y ajoutant l’argument « PACKAGE="nompackage" »
(ex. : l’appel « .C("fctC",as.integer(a)) » devient « .C("fctC",as.integer(a),PACKAGE="nompackage") »).
Remarque : Si le package contient un espace de nommage (un fichier NAMESPACE), le fichier
zzz.R ne doit pas être celui définit ci-dessus. Il doit plutôt être le suivant :
.onLoad <-function (lib, pkg) {
library.dynam("nompackage", pkg, lib)
}
C - Modification des fichiers d’information sur le package :
Afin de finaliser les fichiers sources du package, il faut aller modifier l’information dans le
fichier ‘.\nompackage\DESCRIPTION’ et les fichiers .Rd du sous répertoire ‘.\nompackage\man’.
La fonction « package.skeleton » a créé des gabarits pour ces fichiers. Ils ont donc déjà la bonne
structure. La modification de ces fichiers est une étape longue, mais nécessaire…
a) Modifier les informations du fichier ‘.\nompackage\DESCRIPTION’. Les champs
obligatoires sont ceux intitulés Package, Version, License, Description, Title, Author et
Maintainer. Le manuel Writing R Extensions (R Team, 2007b) décrit ces champs, ainsi que
tous ceux qui sont optionnels. Si le package créé utilise des fonctions provenant d’autres
packages, ceux-ci doivent être mentionnés dans le champ Depends du fichier
DESCRIPTION. Les package inscrits dans le champ Depends seront automatiquement
chargés en R lors du chargement du package créé.
b) Modifier les informations des fichiers .Rd dans le sous répertoire ‘.\nompackage\man’. Ces
fichiers vont permettre de générer la documentation des fonctions et des jeux de données du
package. Le langage dans lequel sont écrits les fichiers .Rd ressemble à LaTeX. Le chapitre
2 du manuel Writing R Extensions (R Team, 2007b) contient toutes les informations à
connaître pour rédiger de la documentation en format .Rd.
EXEMPLE : http://zoonek2.free.fr/UNIX/48_R/02.html#15
Attention : Il est important que le nom du package soit le même partout. Particulièrement, si le nom
du répertoire du package ne correspond pas à la chaîne de caractères après « Package: » dans le
fichier ‘.\nompackage\DESCRIPTION’, il y a une erreur lors de la construction du package.
4.2.1 Vérification et construction du package
Lorsque les fichiers sources sont prêts, il ne reste plus qu’à les vérifier, puis à construire le
package. Ces deux étapes se font dans une fenêtre de commandes sur Windows ou une fenêtre
terminal sur Linux. On peut aussi en profiter alors pour générer un document dvi, ps ou pdf
documentant le package en regroupant les fiches d’aide de toutes les fonctions et tous les jeux de
données.
12
VÉRIFICATION :
Pour vérifier le package, il faut ouvrir une fenêtre de commande ou une fenêtre terminal, se
placer dans le répertoire contenant le répertoire du package (pas dans le répertoire portant le nom
package, mais un niveau au dessus). Ensuite, on tape la commande :
R CMD check nompackage
S’il y a des erreurs, il vaut mieux ne pas les ignorer, car le package pourrait être mal construit ou ne
pas être construit du tout à la prochaine étape. Les avertissements sont moins graves et leur présence
ne signale pas nécessairement des problèmes futurs.
Pour vérifier un package qui contient du code C, C++ ou FORTRAN, vous devrez peut-être
construire le package et l’installer avant de faire la vérification.
DOCUMENTATION :
On crée un fichier pdf documentant le package par la commande :
R CMD Rd2dvi --pdf nompackage
Sur Windows, le document Rd2.pdf sera alors créé dans le répertoire ‘.\Rd2dvi’ et sur Linux, le
document nompackage.pdf sera créé dans le répertoire du package.
CONSTRUCTION :
Après la vérification d’un package, on peut passer à sa construction. Cette dernière étape
dépend de la plateforme informatique sur laquelle on travaille et de la plateforme à laquelle est
destinée le package.
Sur Windows pour Windows :
Taper la commande :
R CMD build --binary nompackage
Un package binaire précompilé (pre-compiled binary package) zippé est ainsi créé. Ce fichier se
nomme nompackage_version.gz où version est le numéro de la version inscrit dans le fichier
DESCRIPTION. C’est de ce fichier que R sous Windows a besoin pour installer un package. Pour
en savoir plus sur les options de la fonction « R CMD build » (ou « R CMD check »), tapez la
commande « R CMD build --help ».
Sur Windows pour Linux :
R sur Linux a besoin des fichiers sources du package pour l’installer et non d’un package
binaire précompilé. La construction du package se fait donc par la commande :
R CMD build nompackage
13
qui crée un fichier nommé « nompackage_version.tar.gz » comprenant les fichiers sources du
package. Ainsi, comparativement à la commande sur Windows pour Windows, il faut omettre
l’option « --binary ».
Sur Linux pour Linux :
Il faut utiliser exactement la même commande que Windows pour Linux.
Sur Linux pour Windows :
Il s’agit de la construction la plus compliquée à effectuer. Si vous avez accès à un ordinateur
sur Windows, il est vraiment plus simple de créer un package R pour Windows sur Windows. Sinon,
voici comment faire.
1) Créer le package pour Linux (avec la commande « R CMD build nompackage »).
2) Installer les « cross-building tools » : http://cran.r-project.org/doc/contrib/Makefile-rcb
(documentés par Yan et Rossini, 2005). :
a) Créer le répertoire ‘./RCrossBuild’.
b) Placer dans ce répertoire le fichier http://cran.r-project.org/doc/contrib/Makefile-rcb en le
nommant Makefile.
c) Modifier le Makefile :
• Remplacer R = R-2.1.0 par la version de R qu’on utilise (ex. : R = R-2.5.0) ;
• Remplacer MINGW_CROSS = mingw-cross4 par la version se trouvant sur le
site web http://www.stats.ox.ac.uk/pub/Rtools/ (exemple : (février 2006)
MINGW_CROSS = mingw-cross5).
d) Dans une fenêtre terminal, se placer dans le répertoire courant ‘./RCrossBuild’ et soumette
les commandes :
make down
make xtools
make prepsrc
make linuxR
make LinuxFresh=Yes mkrules
make R
Remarque : Les commandes « make linuxR » et « make R » sont longues à exécuter
(environ 30 min et 15 min respectivement).
3) Créer les sous répertoire ‘./RCrossBuild/pkgsrc’ et ‘./RCrossBuild/Winlibs’.
4) Placer le package Linux (.tar.gz) dans le sous répertoire ‘./RCrossBuild/pkgsrc’.
5) Dans une fenêtre terminal (toujours dans répertoire courant ‘./RCrossBuild’) soumettre la
commande :
14
make pkg-nompackage_version
6) Le package R pour Windows a été créé et se trouve dans le répertoire ‘./RCrossBuild/Winlibs’.
5 Solution à différents messages d’erreur
Voici certains problèmes que vous pouvez rencontrer en cours de travail et leurs solutions.
• Message d’erreur en R lors de l’appel d’une fonction C avec .C :
C entry point "fctC" not in load table
Solution : Vous avez peut-être oublié de charger le fichier dll contenant la function "fctC". Si votre
fichier dll est bien chargé et que vous aviez bien nommé votre fonction "fctC" dans votre code C,
alors c’est peut-être que votre compilateur a modifié le nom de votre fonction. Pour connaître le
nom des fonctions exportées par un dll, suivez les étapes suivantes :
- Ouvrez vous une fenêtre de commandes ;
- Placez vous dans le répertoire contenant le fichier dll ;
- Tapez la commande :
objdump -p nomfichier.dll
Le nom des fonctions se trouvent dans la section intitulée : « [Ordinal/Name Pointer] Table ».
Pour appeler les fonctions de ce dll en R, vous devez utiliser les noms dans le dll. (source
d’information : http://www.stats.uwo.ca/faculty/murdoch/software/compilingDLLs/index.html#badname).
• Message d’erreur (de toute commande R CMD …) :
‘R’ n’est pas reconnu en tant que commande interne ou externe, un programme
exécutable ou un fichier de commandes
Solution : Ajouter le répertoire bin de R au PATH (voir section 2.2).
• Message d’erreur (de R CMD build) :
Please set TMPDIR to a valid temporary directory
Solution : Définir la variable d’environnement TMPDIR (voir section 2.3).
• Message d’erreur (de R CMD build ou R CMD check) :
‘perl’ n’est pas reconnu en tant que commande interne ou externe, un programme exécutable
ou un fichier de commandes
Solution : Installer Perl et ajouter son répertoire bin au PATH (voir sections 2.1 et 2.2).
15
• Message d’erreur (de R CMD build ou R CMD check) :
‘sh’ n’est pas reconnu en tant que commande interne ou externe, un programme exécutable
ou un fichier de commandes
Solution : Installer Rtools et ajouter son répertoire bin au PATH (voir sections 2.1 et 2.2).
• Message d’erreur (de R CMD check) :
hhc : not found
Solution : Installer HTML Help Workshop et ajouter son répertoire au PATH (voir sections 2.1 et
2.2).
• Message d’erreur (de R CMD check) :
LaTeX Error : file ‘Rd.sty’ not found
Solution : Cette erreur peut survenir si vous utilisez une ancienne version de MiKTeX. Pour régler
le problème vous pouvez soit installer la version la plus récente de MiKTeX, soit suivre les étapes
suivantes :
a) Créer un sous répertoire nommé « tex » dans le répertoire « C:\localtexmf » ;
b) Copier tous les dossiers du répertoire « C:\Program Files\R\R-2.5.0\share\texmf » dans le
répertoire « C:\localtexmf\tex » ;
c) Pour s’assurer que tout fonctionne, aller dans :
« Menu démarrer Æ Programmes Æ MiKTeX Æ MiKTeX Options Æ General »
et cliquer sur « Refresh Now » et « Update Now ».
• Avertissement (de R CMD check) :
checking for CRLF line endings in C/C++/Fortran sources/headers ... WARNING
Found the following sources/headers with CRLF line endings:
src/programme.c
Some Unix compilers require LF line endings.
Solution : Il faut convertir le fichier C. Cette conversion est effectuée avec la fonction « dos2unix ».
Sur Linux, dans une fenêtre terminal, faites rouler dans le répertoire du programme C la commande :
dos2unix programme.c
Sur Windows, il faut d’abord installer le logiciel UDDU qu’on peut télécharger gratuitement à partir
de la page web : http://www.bastet.com. Mettre le contenu du fichier zip téléchargé dans le
répertoire de son choix et ajouter ce répertoire au PATH de son ordinateur. Ensuite, dans une fenêtre
de commandes, on se place dans le répertoire du programme C et on exécute la même commande
que sur Linux (« dos2unix programme.c »).
16
6 Utilisation de WinEdt comme éditeur de code R
En terminant, mentionnons pour ceux qui travaillent sur Windows que le logiciel WinEdt, en
plus d’être très efficace pour la création de documents LaTeX, peut être adapté afin de devenir un
éditeur de code R. L’écriture de code R est plus intéressante dans WinEdt que dans un éditeur de
texte usuel, tel le bloc-notes, car des fonctions y sont reconnus et mises en évidence par de la
couleur, l’italique ou le gras. Une fonctionnalité permet également de vérifier que les délimiteurs tel
les parenthèses viennent tous en paire. En plus, on peut y soumettre directement du code. Plus
besoin de faire des copier/coller !
Afin d’utiliser WinEdt comme éditeur de code R, vous devez préalablement avoir une
version de WinEdt installée sur votre ordinateur. WinEdt s’adapte à l’édition de code R grâce à un
package R nommé RWinEdt. Vous devez d’abord télécharger ce package sur le CRAN (http://cran.rproject.org/src/contrib/Descriptions/RWinEdt.html). Ensuite, vous devez simplement installer et
charger le package en R. Le module d’extension (plug-in) nommé RWinEdt sera automatiquement
créé. Le seul détail qui complique un peu le processus est que le package RWinEdt fonctionne
seulement avec R en mode sdi. Une façon pratique d’ouvrir R en mode sdi est de créer un deuxième
raccourci R. Le raccourci original ouvre R en mode mdi et le second l’ouvrira en mode sdi. Pour
créer ce deuxième raccourci, vous pouvez suivre les étapes suivantes :
1) Faire une copie du raccourci R standard (cliquer sur le raccourci standard avec le bouton de
droite de la souris, sélectionner « Envoyer vers » puis « Bureau »). Renommer ce raccourci « R
2.2.1 sdi » ou autre.
2) Modifier les propriétés du nouveau raccourci (cliquer sur le nouveau raccourci avec le bouton de
droite de la souris, sélectionner « Propriétés ») en ajoutant un espace puis la chaîne de caractères
« "--sdi" » (avec les guillements) après l'emplacement de la cible du raccourci. Ainsi, dans
l'onglet nommé « Raccourci » des propriétés du nouveau raccourci, la cible est maintenant :
"C:\Program Files\R\R-2.5.0\bin\Rgui.exe" "--sdi"
C’est donc dans R ouvert avec ce raccourci que vous devez charger le package RWinEdt. Par la
suite, lors de l’utilisation de RWinEdt, vous devrez aussi ouvrir R en mode sdi afin de pouvoir
soumettre du code directement dans RWinEdt. Plus d’informations sur le module d’extension
RWinEdt se trouvent dans le fichier ReadMe.txt du package RWinEdt.
17
Bibliographie
Baillargeon, S. (2006). Présentation intitulée Programmation en R : incorporation de code C et
création de packages. Université Laval. Disponible en ligne :
http://www.mat.ulaval.ca/fileadmin/informatique/LogicielR/ProgR_AppelC_Package_Pres.pdf
Hornik, K. (2007). The R FAQ. En ligne : http://cran.r-project.org/doc/FAQ/R-FAQ.html
Murdoch, D. (2007). Building R for Windows. En ligne :
http://www.murdoch-sutherland.com/Rtools/
Peng, R.D et Leeuw, J. (2002). An introduction to the .C Interface to R. UCLA Department of
Statistics. Disponible en ligne : http://www.cs.colostate.edu/~sokolov/interface.pdf.
R Development Core Team. (2007a). R Installation and Administration, version 2.5.0. Disponible
en ligne : http://cran.r-project.org/doc/manuals/R-admin.pdf.
R Development Core Team. (2007b). Writing R Extensions, version 2.5.0. Disponible en ligne :
http://cran.r-project.org/doc/manuals/R-exts.pdf.
Yan, J. et Rossini, A.J. (2005). Building Microsoft Windows Versions of R and Packages under Intel
Linux. Disponible en ligne : http://cran.r-project.org/doc/contrib/cross-build.pdf
18