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 :

Introduction de code R dans C


Sujet :

R

  1. #1
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut Introduction de code R dans C
    Bonjour,

    la question a déjà été abordée dans de nombreux forums (notamment celui-ci), mais je ne m'en sors pas

    Afin de "comprendre ce que je ne comprend pas", je vous soumets un petit exemple de code: si vous pouviez m'indiquer mes erreurs svp

    Tout d'abord, je crée, dans R, une fonction recup_Donnees.R, qui prend en entrée le nom d'un fichier, fait un calcul -de survie- et me retourne la statistique du chi2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    recup_Donnees <- function(x){
      library(survival)
      DataF <- read.csv2(paste("C:\\Users\\utilisateur\\Documents\\", x, sep = ""), header=T)
      stat_test <- survdiff(Surv(temps, statut) ~ groupe, data=DataF)
      return(stat_test$chisq)      
    }
    Ensuite, dans C, je veux appeler cette fonction pour comparer la statistique de test à un nombre fixé (exemple totalement absurde/inutile, construit seulement pour comprendre le passage R<->C):
    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
    #include <R.h>
    #include <Rinternals.h>
     
    void AppelFctUtilPackage(SEXP MyData, void **fct, void *env, int *res)
    {
        SEXP f, rho;
        int i;
     
        /* Mettre la fonction R et son environnement dans des variables de type SEXP */
        f = (SEXP)fct;
        rho = (SEXP)env;
     
        PROTECT(res=allocVector(res, REALSXP));
     
        i = lang2(f, MyData);
        Rprintf("%d", i);
        if (i>18)
        {
            res = 1;
        }
        else
        {
            res = 2;
        }
        UNPROTECT(1);
        return res;
    }
    Je compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    R CMD SHLIB AppelFctUtilPackage.c
    Le fichier AppelFctUtilPackage.dll est bien créé.

    Enfin, je retourne dans R:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dyn.load("C:\\Users\\utilisateur\\Documents\\AppelFctUtilPackage.dll")
    source("C:\\Users\\utilisateur\\Documents\\recup_Donnees.R")
    res <- 0 
    .C("AppelFctUtilPackage", "DataFreireich.csv", recup_Donnees, new.env(), res=as.integer(res))
    Erreur retournée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur : type 102251408 est indisponible dans 'type2char'
    Merci à tous ceux (et toutes celles) qui auront eu le courage de lire jusqu'ici
    Et merci d'avance pour votre aide!

    Bonne journée

    PS: 1/ pour faire tourner, voici où trouver DataFreireich.csv: ici
    2/ si gbdivers passe par ici: il me semble que Rcpp ne permet l'incorporation de code R que dans C++ et pas dans C. Pourriez-vous me le confirmer svp? Merci!

  2. #2
    Membre chevronné
    Femme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Par défaut rectification du code C
    Bonjour,

    j'ai tenté de rectifier mon code C de la façon suivante:
    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
    #include <R.h>
    #include <Rinternals.h>
     
    void AppelFctUtilPackage(char **MyData, void **fct, void *env, int *res)
    {
        SEXP f, rho, i, resultsxpg;
     
        /* Mettre la fonction R et son environnement dans des variables de type SEXP */
        f = (SEXP)fct;
        rho = (SEXP)env;
     
        PROTECT(i = lang2(f, MyData));
        PROTECT(resultsxpg=eval(i,rho));
     
        if (REAL(resultsxpg)[0]>18)
        {
            res[0] = 1;
        }
        else
        {
            res[0] = 0;
        }
        UNPROTECT(2);
    }
    mais j'obtiens un warning:
    passing arg2 of 'Rf_lang2' from incompatible pointer type
    Cela compile malgré tout mais R plante

    J'ai conscience que cela vient de mon incompréhension du langage C
    Je reviens vers vous car je pense que d'autres ont été confronté à ce genre de codage (alors que des programmeurs C auront moins l'habitude de ces types d'objets à mi-chemin entre R et C).

    Merci d'avance pour votre aide

    Bonne soirée!

    PS: en changeant la première ligne de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AppelFctUtilPackage(SEXP MyData, void **fct, void *env, int *res)
    je n'ai plus le warning, mais R plante toujours

Discussions similaires

  1. [HTML 5] Introduction code fxml dans page HTML sous Google Sites
    Par jj6401 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 0
    Dernier message: 21/02/2009, 15h53
  2. [CR] Utilisation de codes à barres dans crystal
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 29/06/2004, 08h48
  3. Insertion code html dans bdd
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/04/2004, 15h03
  4. [CODE] Application dans la zone de notification
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/05/2003, 19h06
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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