IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Incorporer du code R dans un programme C++


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut Incorporer du code R dans un programme C++
    Bonjour,

    En lisant sur un peu partout sur le net, je me suis rendu compte qu'il était possible d'incorporer un code en C/C++ dans R (langage de programmation statistique).
    Je voulais savoir si l'inverse était possible, c'est-à-dire intégrer un code R dans un programme de C/C++.
    Si c'est le cas, qu'elles seraient les procédures à suivre.

    Bien cordialement,

  2. #2
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Bonjour,

    Je m'apprêtais à te répondre que "non, pas à ma connaissance" mais j'ai fais quelques recherches par acquis de conscience et je suis tombé sur Swig (voir pour R)... mais je n'arrive pas à comprendre si c'est "bi-directionnel" ou non.

    Mais en regardant dans "Writing R extensions" pour vérifier s'ils en faisaient mention, j'ai trouvé tout autre chose qui semble prometteur : Parsing R code from C.

    Je reste intéressé par d'éventuels retours sur la question.
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  3. #3
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Ah et également la section précédente : Evaluating R expressions from C.

    Note tout de même que tout cela concerne des fonctions C qui, à la base, sont appelées depuis R. Mais ça montre bien que la communication peut être bi-directionnelle.
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Salut,

    J'ai trouvé deux liens assez intéressants sur la question.
    Qu'en penses tu?
    http://ciam.inra.fr/r4ciam/appelRinC.html
    http://ciam.inra.fr/r4ciam/intR.html#api

  5. #5
    Membre expert
    Avatar de pitipoisson
    Homme Profil pro
    Chercheur
    Inscrit en
    Septembre 2006
    Messages
    1 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 942
    Points : 3 378
    Points
    3 378
    Par défaut
    Que pour ce qui est du cas général (premier lien), j'avais pas trop mal compris
    Dans tous les cas, le programme C est lui-même appelé depuis R.


    Plus sérieusement, belle trouvaille, ça a l'air bien fait.

    En ce qui concerne le second lien, ça me paraît très intéressant, mais je serais curieux de voir quelle utilisation on peut en faire (à quelles fonctionnalités de R on a accès).
    Forum LaTeX : pour des réponses rapides et appropriées, pensez à poster un
    ECM = Exemple (reproduit le problème) Complet (document compilable) Minimal (ne postez pas votre thèse !)

    Une solution vous convient ? N'oubliez pas le tag


    )><))))°>

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Perso, j'utilise RInside et Rcpp pour appeler du code R dans un programme C++. C'est relativement simple (plus que d'appeler directement l'api R ; le code de R est relativement complexe, mal documenté et plein de macros).

    Quelques codes d'exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    struct MyData
    {
        int un_int;
        float un_float;
        std::string un_string;
    };
     
    int main(int argc, char *argv[])
    {
        RInside R(argc, argv);
     
        // executer une fonction
        R.parseEvalQ("print('hello world!')");
     
        std::cout << std::endl;
        // lecture et ecriture d'une variable
        R["x"] = 10;
        R["y"] = 20;
     
        R.parseEvalQ("z <- x + y");
     
        int z = R["z"];
        std::cout << "z:" << z << std::cout;
     
        std::cout << std::endl;
        // lecture et écriture d'un vecteur numérique
        const double dvec[6] = { 0.1 , 0.1 , 0.1 , 0.1 , 0.3 , 0.3 };
        const std::vector<double> v(dvec , dvec+6);
        R.assign(v, "v");
     
        SEXP ans;
        ans = R.parseEval("v*2");
     
        Rcpp::NumericVector v2(ans);
        for (int i=0; i<6; ++i) std::cout << "v2." << i << ":" << v2[i] << std::endl;
     
        std::cout << std::endl;
        // lecture/écriture d'un vecteur string
        std::vector<std::string> vs;
        vs.push_back("string 1");
        vs.push_back("string 2");
        R.assign(vs, "vs") ;
     
        ans = R.parseEval("size <- length(vs); paste(vs, ' toto'); ");
        int size = R["size"];
        std::cout << "size:" << size << std::endl;
     
        Rcpp::CharacterVector vs2(ans);
        for (int i=0; i<size; ++i) std::cout << "vs2." << i << ":" << vs2[i] << std::endl;
     
        std::cout << std::endl;
        // lecture/écriture d'un type complexe
        MyData d;
        d.un_float = 12.3456;
        d.un_int = 12345;
        d.un_string = "un test";
     
        R.assign(d.un_float, "d$un_float");
        R.assign(d.un_int, "d$un_int");
        R.assign(d.un_string, "d$un_string");
     
        R.parseEvalQ("print(d)");
     
        // ouverture d'une library et appel de fonction
        R.parseEvalQ(
                "library(MassSpecWavelet);"
                "ms <- read.table('data.txt', dec='.', sep=' ');"
                "mz <- ms[17000:17500,3];"
                "size <- length(mz);");
     
        size = R["size"];
        std::cout << "size:" << size << std::endl;
     
        Rcpp::NumericVector mz = R["mz"];
        std::cout << "mz size:" << mz.size() << std::endl;
     
        for (int i=0; i<mz.size(); ++i) mz[i] += 100.0 * cos(i/10.0);
     
        // enregistrement de l'image vers un png
        R.assign(mz, "mz_out");
        R.parseEvalQ(
                "png('toto.png');"
                "plot(mz, type='l', col='red');"
                "lines(mz_out, type='l', col='blue');");
     
        //exec complex script
        R.parseEvalQ(
                "mz_inf = which(ms[,2] > 2080)[1];"
                "mz_sup = which(ms[,2] > 2110)[1];"
                "exampleMS <- ms[mz_inf:mz_sup, 3];"
     
                "scales <- seq(1, 10, 0.2);"
                "wavelet <- 'mexh'; print('A');"
                "wCoefs <- cwt(exampleMS, scales = scales, wavelet = wavelet);print('B');"
     
                "wCoefs <- cbind(as.vector(exampleMS), wCoefs);print('C');"
                "colnames(wCoefs) <- c(0, scales);print('D');"
                "png('toto2.png'); image(wCoefs); print('E');"
                       );
     
        return 0;
    }
    mais je serais curieux de voir quelle utilisation on peut en faire (à quelles fonctionnalités de R on a accès)
    Tout ! On accès à une vraie session R : code saisie par l'utilisateur, accès aux libs (j'utilise beaucoup bioconductor), graphique (mais ça peut planter si on utilise déjà des contextes graphiques dans l'application, je préfère enregistrer les graphiques dans un fichier image puis l'afficher)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Effectivement le RInside et le Rccp ont l'air pas mal. D'ailleurs je l'utilise actuellement dans un code.
    J'essaye de compiler le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <RInside>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        RInside R(argc, argv);
        R["txt"]= "Hello, world!\n";
        R.parseEvalQ("cat(txt)");
        cout << "Hello world!" << endl;
        return 0;
    }
    Veuillez trouver ci-joint les erreurs qui ont été compilées.
    Images attachées Images attachées  

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    C'est plus un problème C++ : tu n'as pas inclus correctement les en-têtes de Rinside. Je n'ai pas utilisé code::block depuis longtemps donc ça va être difficile de t'aider mais une recherche rapide sur le forum C++ devrait t'aider (c'est un problème courant)

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Ok, merci pour la réponse.

Discussions similaires

  1. Comment scanner des codes barre dans un programme ?
    Par looping dans le forum Langage
    Réponses: 7
    Dernier message: 08/12/2007, 08h14
  2. integrer du code perl dans un programme java
    Par alphonse62 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 07/05/2007, 07h17
  3. Réponses: 4
    Dernier message: 22/04/2007, 08h31
  4. introduire du code assembleur dans un programme C++
    Par hzaki1986 dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2007, 17h14
  5. compiler du code c dans un programme cpp
    Par momofiant dans le forum C++
    Réponses: 1
    Dernier message: 05/01/2007, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo