[Rcpp-devel] call R internal adist function from Rcpp

Dirk Eddelbuettel edd at debian.org
Mon Dec 30 19:33:47 CET 2013


Amine,

On 30 December 2013 at 19:26, contact AG STUDY wrote:
| I need to call R adist function over a big vector, many times.
| Internally , adist is calling adist_full defined in src/main/agrep.c. So
| wonder If I can call the c function adist_full directly from my c++ code.

You may need to reimplement the adist_full() function in your own package.
You can start by copying it and then figuring out one-by-one what the
dependencies are, and satisfy those.

I am not so familiar with the NPL and text regression fields, but similar
functionality may be available somewhere else too.
 
| My workaround is to give adist as a Function parameter. here my code:
| #include <Rcpp.h>
| using namespace Rcpp;
| 
| // [[Rcpp::export]]
| List call_adist(CharacterVector y, Function f,int tol=16) {
|     std::vector<std::vector<int> > out;
|     std::vector<std::string> input = as<std::vector<std::string> >(y);
|     for (std::vector<std::string>::iterator it = input.begin() ; it !=
| input.end(); ++it){
|       //  can I change f call by adist_full(*it,y,costs,false)?
|         std::vector<int> res = as<std::vector<int> >(f(*it,y)); 

This will indeed not be fast as you call out to R each time. You would need
this functionality as C/C++ code.

Dirk

 
|         out.push_back(res);
|     }
|     return Rcpp::wrap(out);
| }
| Then I call it like :
| 
|     call_adist(vv,adist)
| 
| But this is less efficient than lapply(vv,adist).
| 
| Happy New Year!
| 
| 
| 
| 
| 
| ----------------------------------------------------------------------
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list