From guillaume.proteowiki at free.fr  Thu Aug 16 14:08:53 2007
From: guillaume.proteowiki at free.fr (Guillaume B.)
Date: Thu, 16 Aug 2007 05:08:53 -0700 (PDT)
Subject: [Rd] call R function in c++ program
Message-ID: <12180033.post@talk.nabble.com>


Hi all
I don't know if my message are correct in this forums.
I create a program in c++ who use statistical function. I want to execute
this function in R (in particular for use packages ade4, lattice,
bioconductor...)

Until now, my program work for simple function ("plot", "rnorm"...) but I
can't use library

My class are :

// in constructor
     int argc = 1;
     char *argv[] = {"wxR"};
     Rf_initEmbeddedR(argc, argv);
     rho = R_GlobalEnv;

// in destructor
     Rf_endEmbeddedR(0);

// for translate std::vector to SEXP VECTOR
// std_vector are defined as "vector<double>" and iterator as
"vector<double>::iterator"
     PROTECT( vector_SEXP = allocVector(REALSXP, std_vector.size()) );
     int i = 0;
     for(std_iterator s_it=std_vector.begin(); s_it!=std_vector.end();
s_it++)
     {
         REAL(vector_SEXP)[i] = (double) *s_it;
         i++;
     }
     UNPROTECT(1);

// for create a variable in R environement
     defineVar(install("variable_name"), variable_value_SEXP, rho);

// for execute "complex" function (with parser)
     PROTECT( e1 = mkString("plot(variable_name, type=\"l\")") );
     PROTECT( e2 = R_ParseVector(e1, 1, &status, R_NilValue) );
     R_tryEval(VECTOR_ELT(e2,0), rho, &hadError);
     UNPROTECT(2);

// for execute "simple" function (without parser)
     PROTECT( e1 = lang3(install(":"), ScalarInteger(1), ScalarInteger(4))
);
     PROTECT( e2 = lang4(install("matrix"), e1, ScalarInteger(4),
ScalarInteger(1)) );
     PROTECT( e3 = lang2(install("layout"), e2) );
     eval(e3,R_GlobalEnv);
     UNPROTECT(3);

// for call library (using parser)
     PROTECT( e1 = mkString("library(ade4, logical.return=TRUE);
     PROTECT( e2 = R_ParseVector(e1, 1, &status, R_NilValue) );
     e3 = R_tryEval(VECTOR_ELT(e2,0), rho, &hadError);
     UNPROTECT(2);
     if(LOGICAL(e3)[0])
          // succes
     else
          // echec

Until this point, all my function succes !

When I try to call function in ade4 library, I have error 1 :
     PROTECT( e1 = mkString("a<-dudi.pca(b,scannf=FALSE, nf=2)") 
     PROTECT( e2 = R_ParseVector(e1, 1, &status, R_NilValue) );
     R_tryEval(VECTOR_ELT(e2,0), rho, &hadError);
     UNPROTECT(2);

You know where come from the problem ?

Bonus question 1 :
I can't call directely the function plot(x, type="l") without parser.
if I try somthing like this, it's doesn't work :
     PROTECT( e2 = lang4(install("type"), mkChar("l")) );
     PROTECT( e3 = lang3(install("plot"), e1, e2) );
     eval(e3,R_GlobalEnv);
     UNPROTECT(3);
How can I resolve this ?

Bonus question 2 :
When I call some "plot" function, my program crash. And I don't khow why


Thanks for yours suggests
-- 
View this message in context: http://www.nabble.com/call-R-function-in-c%2B%2B-program-tf4279222.html#a12180033
Sent from the R devel mailing list archive at Nabble.com.



[Rd] call R function in c++ program
Guillaume B.