SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
Incorporation de code C en R
   Création d’un package en R




Incorporation de code C en R
  Création d’un package R

                    Pierre Alquier




Groupe de travail R, mercredi 2 mai 2012


               Pierre Alquier   C/R/Packages
Incorporation de code C en R
               Création d’un package en R


Plan




 1   Incorporation de code C en R


 2   Création d’un package en R




                           Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


Pourquoi utiliser du code C en R ?

  L’execution de programmes écrits en R est souvent assez lente,
  en particulier en présence de boucles.
  Un exemple idiot :

   f = function(X)
   {
      RES = 0
      for (i in 1:length(X)) RES = RES + X[i]
      return(RES)
   }



                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
                  Création d’un package en R


La solution !


  Lorsqu’on peut, il faut éviter les boucles et utiliser les
  fonctions R. Dans l’exemple :

   sum(X)

  fait l’affaire...




                              Pierre Alquier   C/R/Packages
Incorporation de code C en R
                  Création d’un package en R


La solution !


  Lorsqu’on peut, il faut éviter les boucles et utiliser les
  fonctions R. Dans l’exemple :

   sum(X)

  fait l’affaire...

  Si ça n’est pas possible, une autre solution consiste à écrire la
  fonction en C, donc l’exécution est beaucoup plus rapide.




                              Pierre Alquier   C/R/Packages
Incorporation de code C en R
                 Création d’un package en R


Ecriture de la fonction en C
  Dans le fichier :
   nomfichier.c
  on écrit :
   #include <R.h>
   #include <Rmath.h>

   void somme(double *x, double *res, int *lg)
   {
      int i;

       for (i=0;i<*lg;i++) *res += x[i];
   }
                             Pierre Alquier   C/R/Packages
Incorporation de code C en R
               Création d’un package en R


Compilation du code C

 La première étape consiste à compiler le code C à l’aide du
 compilateur C. Dans l’invite de commande shell (linux) ou
 DOS (windows) :

 R CMD SHLIB nomfichier.c

 Ceci va créer un objet dynamique (.so) sous linux ou une
 librairie dynamique (.dll) sous windows.
 Ensuite, il faut, sous R, appeler cette librairie :

 dyn.load("nomfichier.so")

 (ou .dll si on travaille sous windows).


                           Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


La fonction .C() de R


  Appel du code C en R via la fonction .C() de R. Attention,
  cette fonction prend en argument :
    1  le nom de la fonction C ;
    2  les variables que l’on donne à manger à cette fonction.
  Cette fonction donne en sortie une liste qui contient comme
  champs :
    1  les variables que l’on a donné à manger à la fonction et
       qui ont pu être modifiées entre temps.




                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
               Création d’un package en R


La fonction .C() de R


  Appel du code C en R :

  g = function(X)
  {
     LG = length(X)
     A = .C("somme",x=as.double(X),res=as.double(0),
                                   lg=as.integer(LG))
     return(A$res)
  }




                           Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


Création d’un package en R




  1   Incorporation de code C en R


  2   Création d’un package en R




                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
                  Création d’un package en R


Pourquoi créer un package ?


  Pourquoi créer un package plutôt que de diffuser directement
  son code en R et en C ?
    1   essentiellement, en travaillant un peu plus, on évite à
        l’utilisateur de devoir gérer les appels à la fonction .C(),
        compiler lui-même, etc...
    2   on obtient un joli produit fini que l’on peut mettre à
        disposition des utilisateurs sur sa page web ou même le
        soumettre sur le site de R.




                              Pierre Alquier   C/R/Packages
Incorporation de code C en R
                 Création d’un package en R


La fonction package.skeleton()

  On souhaite créer le package “MCornec” qui contient deux
  fonctions, “f1” et “f2”, chacune écrite en R mais pouvant
  appeler du code C par l’intermédiaire de la fonction .C(), ainsi
  qu’un jeu de données “data1”.
    1   écrire tous les codes en R et en C et charger toutes les
        fonctions et jeux de données en mémoire ; ie “f1”, “f2” et
        “data1”.
    2   appeler sous R la fonction :
         package.skeleton(list=c("f1","f2","data1"),
                                                  name="MCornec")


                             Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


La structure du package

  Ceci aura eu pour effet de créer dans le répertoire courant la
  structure du package :

   ./MCornec/data/data1.rda
   ./MCornec/man/data1.Rd
   ./MCornec/man/f1.Rd
   ./MCornec/man/f2.Rd
   ./MCornec/man/MCornec-package.Rd
   ./MCornec/R/f1.R
   ./MCornec/R/f2.R
   ./MCornec/Read-and-delete-me
   ./MCornec/DESCRIPTION


                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
               Création d’un package en R


La documentation

 Les fichiers :

  ./MCornec/man/data1.Rd
  ./MCornec/man/f1.Rd
  ./MCornec/man/f2.Rd
  ./MCornec/man/MCornec-package.Rd
  ./MCornec/DESCRIPTION

 sont des formulaires dont il faut remplir les champs : que fait
 la fonction, quels sont ses arguments, qui l’a écrite, etc...
 Attention, si il est mal rempli, ceci causera des messages
 d’erreurs lors de la compilation du package.


                           Pierre Alquier   C/R/Packages
Incorporation de code C en R
               Création d’un package en R


Le code C
 Si du code C est appelé par une des fonctions R, celui-ci doit
 être ajouté dans le package. Il faut créer le répertoire :

  ./MCornec/src/

 et mettre dedans un unique fichier .c contenant le code. Il faut
 également créer le fichier suivant :

  ./MCornec/R/zzz.R

 contenant uniquement le code

  .First.lib = function(lib,pkg) {
     library.dynam("MCornec",pkg,lib)
  }

                           Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


La compilation : sous linux

  Dans le répertoire courant, dans le shell :

   R CMD check MCornec

  vérifie que le package est en état d’être compilé, puis :

   R CMD build MCornec

  crée le package dans le fichier

   ./MCornec.tar.gz

  prêt à être installé sous R sur n’importe quel ordinateur.


                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
                Création d’un package en R


La compilation : sous windows

  Dans le répertoire courant, dans l’invite de commande
  MS-DOS :

   R CMD check MCornec
   R CMD build --binary MCornec

  compile et crée le package dans le fichier

   ./MCornec.zip

  Attention, pour que ceci fonctionne, il faudra avoir
  préalablement installé (en plus de R) un compilateur LaTeX,
  un compilateur C, les outils Perl, Rtools (disponibles sur
  internet) et s’assurer que tous ces outils sont dans le PATH.

                            Pierre Alquier   C/R/Packages
Incorporation de code C en R
                     Création d’un package en R


Sources / pour aller plus loin

  Ces slides ont été essentiellement préparés à partir du
  document :
      Sophie Baillargeon (Université Laval). Programmation en R : incorporation de code C et création
      de packages, 2007.
      Disponible en ligne, par exemple :
      http ://www.mat.ulaval.ca/fileadmin/informatique/LogicielR/ProgR_AppelC_Package.pdf



  Egalement, on trouve une documentation très très complète
  sur le site de R mais qui s’adresse déjà à des codeurs
  expérimentés :

      R Development Core Team. Writing R Extensions, 2012 (pour la version 2.15.0 de R).
      Disponible en ligne :
      http ://cran.r-project.org/doc/manuals/R-exts.pdf




                                  Pierre Alquier     C/R/Packages

Contenu connexe

Tendances

Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionECAM Brussels Engineering School
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012Jean-Michel Doudoux
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieLoic Yon
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp FrGregory Renard
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieLoic Yon
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresECAM Brussels Engineering School
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMALoic Yon
 

Tendances (20)

Python avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exceptionPython avancé : Gestion d'erreurs et mécanisme d'exception
Python avancé : Gestion d'erreurs et mécanisme d'exception
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partie
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
C# langage & syntaxe
C#   langage & syntaxeC#   langage & syntaxe
C# langage & syntaxe
 
TP2 RMI
TP2 RMITP2 RMI
TP2 RMI
 
Introdot Netc Sharp Fr
Introdot Netc Sharp FrIntrodot Netc Sharp Fr
Introdot Netc Sharp Fr
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partie
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 

En vedette

R aux enquêtes de conjoncture
R aux enquêtes de conjonctureR aux enquêtes de conjoncture
R aux enquêtes de conjoncturefrancoismarical
 
Premier pas de web scrapping avec R
Premier pas de  web scrapping avec RPremier pas de  web scrapping avec R
Premier pas de web scrapping avec RCdiscount
 
Introduction à la cartographie avec R
Introduction à la cartographie avec RIntroduction à la cartographie avec R
Introduction à la cartographie avec RCdiscount
 
Fltau r interface
Fltau r interfaceFltau r interface
Fltau r interfaceCdiscount
 
Exports de r vers office
Exports de r vers officeExports de r vers office
Exports de r vers officefrancoismarical
 
Parallel R in snow (english after 2nd slide)
Parallel R in snow (english after 2nd slide)Parallel R in snow (english after 2nd slide)
Parallel R in snow (english after 2nd slide)Cdiscount
 
Dataiku r users group v2
Dataiku   r users group v2Dataiku   r users group v2
Dataiku r users group v2Cdiscount
 
Cartographie avec igraph sous R (Partie 2)
Cartographie avec igraph sous R (Partie 2)Cartographie avec igraph sous R (Partie 2)
Cartographie avec igraph sous R (Partie 2)Cdiscount
 
Cartographie avec igraph sous R (Partie 1)
Cartographie avec igraph sous R (Partie 1) Cartographie avec igraph sous R (Partie 1)
Cartographie avec igraph sous R (Partie 1) Cdiscount
 
R fait du la tex
R fait du la texR fait du la tex
R fait du la texCdiscount
 
RStudio is good for you
RStudio is good for youRStudio is good for you
RStudio is good for youCdiscount
 
Première approche de cartographie sous R
Première approche de cartographie sous RPremière approche de cartographie sous R
Première approche de cartographie sous RCdiscount
 
Comptabilité Nationale avec R
Comptabilité Nationale avec RComptabilité Nationale avec R
Comptabilité Nationale avec RCdiscount
 
Le modèle de Black Scholes
Le modèle de Black ScholesLe modèle de Black Scholes
Le modèle de Black ScholesAmal Eljadiri
 
Plutniak maisonobe resto atelier2-network
Plutniak maisonobe resto atelier2-networkPlutniak maisonobe resto atelier2-network
Plutniak maisonobe resto atelier2-networkMarion Maisonobe
 

En vedette (20)

R aux enquêtes de conjoncture
R aux enquêtes de conjonctureR aux enquêtes de conjoncture
R aux enquêtes de conjoncture
 
Premier pas de web scrapping avec R
Premier pas de  web scrapping avec RPremier pas de  web scrapping avec R
Premier pas de web scrapping avec R
 
Introduction à la cartographie avec R
Introduction à la cartographie avec RIntroduction à la cartographie avec R
Introduction à la cartographie avec R
 
R in latex
R in latexR in latex
R in latex
 
Fltau r interface
Fltau r interfaceFltau r interface
Fltau r interface
 
Exports de r vers office
Exports de r vers officeExports de r vers office
Exports de r vers office
 
Parallel R in snow (english after 2nd slide)
Parallel R in snow (english after 2nd slide)Parallel R in snow (english after 2nd slide)
Parallel R in snow (english after 2nd slide)
 
Dataiku r users group v2
Dataiku   r users group v2Dataiku   r users group v2
Dataiku r users group v2
 
HADOOP + R
HADOOP + RHADOOP + R
HADOOP + R
 
Cartographie avec igraph sous R (Partie 2)
Cartographie avec igraph sous R (Partie 2)Cartographie avec igraph sous R (Partie 2)
Cartographie avec igraph sous R (Partie 2)
 
Cartographie avec igraph sous R (Partie 1)
Cartographie avec igraph sous R (Partie 1) Cartographie avec igraph sous R (Partie 1)
Cartographie avec igraph sous R (Partie 1)
 
R fait du la tex
R fait du la texR fait du la tex
R fait du la tex
 
RStudio is good for you
RStudio is good for youRStudio is good for you
RStudio is good for you
 
Première approche de cartographie sous R
Première approche de cartographie sous RPremière approche de cartographie sous R
Première approche de cartographie sous R
 
Comptabilité Nationale avec R
Comptabilité Nationale avec RComptabilité Nationale avec R
Comptabilité Nationale avec R
 
Gur1009
Gur1009Gur1009
Gur1009
 
Big data with r
Big data with rBig data with r
Big data with r
 
Le modèle de Black Scholes
Le modèle de Black ScholesLe modèle de Black Scholes
Le modèle de Black Scholes
 
Passy Finance
Passy FinancePassy Finance
Passy Finance
 
Plutniak maisonobe resto atelier2-network
Plutniak maisonobe resto atelier2-networkPlutniak maisonobe resto atelier2-network
Plutniak maisonobe resto atelier2-network
 

Similaire à Incorporer du C dans R, créer son package

A la découverte de redo
A la découverte de redoA la découverte de redo
A la découverte de redoThierry Gayet
 
Programmation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxProgrammation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxOlyvierNzighou1
 
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxProgrammation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxOlyvierNzighou1
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxLuneSabsPericolo1
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
Chapitre 3 - Généralités sur le langage C.pdf
Chapitre 3 - Généralités sur le langage C.pdfChapitre 3 - Généralités sur le langage C.pdf
Chapitre 3 - Généralités sur le langage C.pdfShiniGami0o0
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11Microsoft
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinLudovic Piot
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide
 
PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...Romain Cambien
 
Rapport openembedded
Rapport openembeddedRapport openembedded
Rapport openembeddedAyoub Rouzi
 

Similaire à Incorporer du C dans R, créer son package (20)

Cours langage-c
Cours langage-cCours langage-c
Cours langage-c
 
A la découverte de redo
A la découverte de redoA la découverte de redo
A la découverte de redo
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 
Programmation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxProgrammation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptx
 
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxProgrammation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
 
Vs2008 Linq
Vs2008 LinqVs2008 Linq
Vs2008 Linq
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptx
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
Php seance1
Php seance1Php seance1
Php seance1
 
Intro c++
Intro c++Intro c++
Intro c++
 
Microsoft07coursbaptiste
Microsoft07coursbaptisteMicrosoft07coursbaptiste
Microsoft07coursbaptiste
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
Fascicule tp programmation c
Fascicule tp programmation cFascicule tp programmation c
Fascicule tp programmation c
 
Chapitre 3 - Généralités sur le langage C.pdf
Chapitre 3 - Généralités sur le langage C.pdfChapitre 3 - Généralités sur le langage C.pdf
Chapitre 3 - Généralités sur le langage C.pdf
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...
 
Rapport openembedded
Rapport openembeddedRapport openembedded
Rapport openembedded
 

Plus de Cdiscount

Presentation r markdown
Presentation r markdown Presentation r markdown
Presentation r markdown Cdiscount
 
Paris2012 session4
Paris2012 session4Paris2012 session4
Paris2012 session4Cdiscount
 
Paris2012 session3b
Paris2012 session3bParis2012 session3b
Paris2012 session3bCdiscount
 
Scm prix blé_2012_11_06
Scm prix blé_2012_11_06Scm prix blé_2012_11_06
Scm prix blé_2012_11_06Cdiscount
 
Scm indicateurs prospectifs_2012_11_06
Scm indicateurs prospectifs_2012_11_06Scm indicateurs prospectifs_2012_11_06
Scm indicateurs prospectifs_2012_11_06Cdiscount
 
State Space Model
State Space ModelState Space Model
State Space ModelCdiscount
 
Paris2012 session2
Paris2012 session2Paris2012 session2
Paris2012 session2Cdiscount
 
Paris2012 session1
Paris2012 session1Paris2012 session1
Paris2012 session1Cdiscount
 
Prévisions trafic aérien
Prévisions trafic aérienPrévisions trafic aérien
Prévisions trafic aérienCdiscount
 
Robust sequentiel learning
Robust sequentiel learningRobust sequentiel learning
Robust sequentiel learningCdiscount
 
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...Cdiscount
 
Prévision de consommation électrique avec adaptive GAM
Prévision de consommation électrique avec adaptive GAMPrévision de consommation électrique avec adaptive GAM
Prévision de consommation électrique avec adaptive GAMCdiscount
 
Forecasting GDP profile with an application to French Business Surveys
Forecasting GDP profile with an application to French Business SurveysForecasting GDP profile with an application to French Business Surveys
Forecasting GDP profile with an application to French Business SurveysCdiscount
 
Prediction in dynamic Graphs
Prediction in dynamic GraphsPrediction in dynamic Graphs
Prediction in dynamic GraphsCdiscount
 

Plus de Cdiscount (15)

Presentation r markdown
Presentation r markdown Presentation r markdown
Presentation r markdown
 
Paris2012 session4
Paris2012 session4Paris2012 session4
Paris2012 session4
 
Paris2012 session3b
Paris2012 session3bParis2012 session3b
Paris2012 session3b
 
Scm prix blé_2012_11_06
Scm prix blé_2012_11_06Scm prix blé_2012_11_06
Scm prix blé_2012_11_06
 
Scm indicateurs prospectifs_2012_11_06
Scm indicateurs prospectifs_2012_11_06Scm indicateurs prospectifs_2012_11_06
Scm indicateurs prospectifs_2012_11_06
 
Scm risques
Scm risquesScm risques
Scm risques
 
State Space Model
State Space ModelState Space Model
State Space Model
 
Paris2012 session2
Paris2012 session2Paris2012 session2
Paris2012 session2
 
Paris2012 session1
Paris2012 session1Paris2012 session1
Paris2012 session1
 
Prévisions trafic aérien
Prévisions trafic aérienPrévisions trafic aérien
Prévisions trafic aérien
 
Robust sequentiel learning
Robust sequentiel learningRobust sequentiel learning
Robust sequentiel learning
 
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...
Prediction of Quantiles by Statistical Learning and Application to GDP Foreca...
 
Prévision de consommation électrique avec adaptive GAM
Prévision de consommation électrique avec adaptive GAMPrévision de consommation électrique avec adaptive GAM
Prévision de consommation électrique avec adaptive GAM
 
Forecasting GDP profile with an application to French Business Surveys
Forecasting GDP profile with an application to French Business SurveysForecasting GDP profile with an application to French Business Surveys
Forecasting GDP profile with an application to French Business Surveys
 
Prediction in dynamic Graphs
Prediction in dynamic GraphsPrediction in dynamic Graphs
Prediction in dynamic Graphs
 

Incorporer du C dans R, créer son package

  • 1. Incorporation de code C en R Création d’un package en R Incorporation de code C en R Création d’un package R Pierre Alquier Groupe de travail R, mercredi 2 mai 2012 Pierre Alquier C/R/Packages
  • 2. Incorporation de code C en R Création d’un package en R Plan 1 Incorporation de code C en R 2 Création d’un package en R Pierre Alquier C/R/Packages
  • 3. Incorporation de code C en R Création d’un package en R Pourquoi utiliser du code C en R ? L’execution de programmes écrits en R est souvent assez lente, en particulier en présence de boucles. Un exemple idiot : f = function(X) { RES = 0 for (i in 1:length(X)) RES = RES + X[i] return(RES) } Pierre Alquier C/R/Packages
  • 4. Incorporation de code C en R Création d’un package en R La solution ! Lorsqu’on peut, il faut éviter les boucles et utiliser les fonctions R. Dans l’exemple : sum(X) fait l’affaire... Pierre Alquier C/R/Packages
  • 5. Incorporation de code C en R Création d’un package en R La solution ! Lorsqu’on peut, il faut éviter les boucles et utiliser les fonctions R. Dans l’exemple : sum(X) fait l’affaire... Si ça n’est pas possible, une autre solution consiste à écrire la fonction en C, donc l’exécution est beaucoup plus rapide. Pierre Alquier C/R/Packages
  • 6. Incorporation de code C en R Création d’un package en R Ecriture de la fonction en C Dans le fichier : nomfichier.c on écrit : #include <R.h> #include <Rmath.h> void somme(double *x, double *res, int *lg) { int i; for (i=0;i<*lg;i++) *res += x[i]; } Pierre Alquier C/R/Packages
  • 7. Incorporation de code C en R Création d’un package en R Compilation du code C La première étape consiste à compiler le code C à l’aide du compilateur C. Dans l’invite de commande shell (linux) ou DOS (windows) : R CMD SHLIB nomfichier.c Ceci va créer un objet dynamique (.so) sous linux ou une librairie dynamique (.dll) sous windows. Ensuite, il faut, sous R, appeler cette librairie : dyn.load("nomfichier.so") (ou .dll si on travaille sous windows). Pierre Alquier C/R/Packages
  • 8. Incorporation de code C en R Création d’un package en R La fonction .C() de R Appel du code C en R via la fonction .C() de R. Attention, cette fonction prend en argument : 1 le nom de la fonction C ; 2 les variables que l’on donne à manger à cette fonction. Cette fonction donne en sortie une liste qui contient comme champs : 1 les variables que l’on a donné à manger à la fonction et qui ont pu être modifiées entre temps. Pierre Alquier C/R/Packages
  • 9. Incorporation de code C en R Création d’un package en R La fonction .C() de R Appel du code C en R : g = function(X) { LG = length(X) A = .C("somme",x=as.double(X),res=as.double(0), lg=as.integer(LG)) return(A$res) } Pierre Alquier C/R/Packages
  • 10. Incorporation de code C en R Création d’un package en R Création d’un package en R 1 Incorporation de code C en R 2 Création d’un package en R Pierre Alquier C/R/Packages
  • 11. Incorporation de code C en R Création d’un package en R Pourquoi créer un package ? Pourquoi créer un package plutôt que de diffuser directement son code en R et en C ? 1 essentiellement, en travaillant un peu plus, on évite à l’utilisateur de devoir gérer les appels à la fonction .C(), compiler lui-même, etc... 2 on obtient un joli produit fini que l’on peut mettre à disposition des utilisateurs sur sa page web ou même le soumettre sur le site de R. Pierre Alquier C/R/Packages
  • 12. Incorporation de code C en R Création d’un package en R La fonction package.skeleton() On souhaite créer le package “MCornec” qui contient deux fonctions, “f1” et “f2”, chacune écrite en R mais pouvant appeler du code C par l’intermédiaire de la fonction .C(), ainsi qu’un jeu de données “data1”. 1 écrire tous les codes en R et en C et charger toutes les fonctions et jeux de données en mémoire ; ie “f1”, “f2” et “data1”. 2 appeler sous R la fonction : package.skeleton(list=c("f1","f2","data1"), name="MCornec") Pierre Alquier C/R/Packages
  • 13. Incorporation de code C en R Création d’un package en R La structure du package Ceci aura eu pour effet de créer dans le répertoire courant la structure du package : ./MCornec/data/data1.rda ./MCornec/man/data1.Rd ./MCornec/man/f1.Rd ./MCornec/man/f2.Rd ./MCornec/man/MCornec-package.Rd ./MCornec/R/f1.R ./MCornec/R/f2.R ./MCornec/Read-and-delete-me ./MCornec/DESCRIPTION Pierre Alquier C/R/Packages
  • 14. Incorporation de code C en R Création d’un package en R La documentation Les fichiers : ./MCornec/man/data1.Rd ./MCornec/man/f1.Rd ./MCornec/man/f2.Rd ./MCornec/man/MCornec-package.Rd ./MCornec/DESCRIPTION sont des formulaires dont il faut remplir les champs : que fait la fonction, quels sont ses arguments, qui l’a écrite, etc... Attention, si il est mal rempli, ceci causera des messages d’erreurs lors de la compilation du package. Pierre Alquier C/R/Packages
  • 15. Incorporation de code C en R Création d’un package en R Le code C Si du code C est appelé par une des fonctions R, celui-ci doit être ajouté dans le package. Il faut créer le répertoire : ./MCornec/src/ et mettre dedans un unique fichier .c contenant le code. Il faut également créer le fichier suivant : ./MCornec/R/zzz.R contenant uniquement le code .First.lib = function(lib,pkg) { library.dynam("MCornec",pkg,lib) } Pierre Alquier C/R/Packages
  • 16. Incorporation de code C en R Création d’un package en R La compilation : sous linux Dans le répertoire courant, dans le shell : R CMD check MCornec vérifie que le package est en état d’être compilé, puis : R CMD build MCornec crée le package dans le fichier ./MCornec.tar.gz prêt à être installé sous R sur n’importe quel ordinateur. Pierre Alquier C/R/Packages
  • 17. Incorporation de code C en R Création d’un package en R La compilation : sous windows Dans le répertoire courant, dans l’invite de commande MS-DOS : R CMD check MCornec R CMD build --binary MCornec compile et crée le package dans le fichier ./MCornec.zip Attention, pour que ceci fonctionne, il faudra avoir préalablement installé (en plus de R) un compilateur LaTeX, un compilateur C, les outils Perl, Rtools (disponibles sur internet) et s’assurer que tous ces outils sont dans le PATH. Pierre Alquier C/R/Packages
  • 18. Incorporation de code C en R Création d’un package en R Sources / pour aller plus loin Ces slides ont été essentiellement préparés à partir du document : Sophie Baillargeon (Université Laval). Programmation en R : incorporation de code C et création de packages, 2007. Disponible en ligne, par exemple : http ://www.mat.ulaval.ca/fileadmin/informatique/LogicielR/ProgR_AppelC_Package.pdf Egalement, on trouve une documentation très très complète sur le site de R mais qui s’adresse déjà à des codeurs expérimentés : R Development Core Team. Writing R Extensions, 2012 (pour la version 2.15.0 de R). Disponible en ligne : http ://cran.r-project.org/doc/manuals/R-exts.pdf Pierre Alquier C/R/Packages