Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rcpp function calling another rcpp function

Tags:

r

rcpp

I'm guessing this is an easy question, but I'm new to Cpp, and am stuck.

I've created a function in R, using Rcpp and:

// [[Rcpp::export]]

I can call the function in R and it works as intended. Let's call it F1.

Next, I want to create another function, F2, using Rcpp which calls the first function. I use standard function call language (i.e., F1(arguments)), and it compiles fine through R when I use sourceCpp().

But when I try to call F2 in R, I get:

Error in .Primitive(".Call")(

and

F2 is missing

The first .cpp file contains

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F1(NumericVector a) {
  int n = a.size();
  double result=0;  // create output vector
  double ss = 0;

  for(int i = 0; i < n; ++i) {
    ss += pow(a[i],2);
  }

  result = ss;
  return result;
}

The following is in another .cpp file.

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) {
  double result=0;

  result = F1(a);

  return result;
}
like image 436
Scott Avatar asked Nov 02 '13 19:11

Scott


2 Answers

Just put both functions in the same .cpp file, or start working on a package.

If you stick to separate .cpp files, then F2 does not know about F1. You can call back F1 as an R function, but that's not going to be as efficient and you will have to deal with converting outputs to a double, etc ...

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) {
  double result=0;

  // grab the R function F1
  Function F1( "F1" ) ; 
  result = as<double>( F1(a) );

  return result;
}

But really create a package or put all your functions in the same .cpp file.

like image 194
Romain Francois Avatar answered Nov 13 '22 12:11

Romain Francois


Couple of points:

  • Rcpp Attributes is not the only way to export C++ functions to R.

  • Rcpp Attributes renames functions, use the verbose=TRUE argument and see the result. These functions names are randomized but ...

  • Rcpp Attributes has an export-to-C++ ability, see Rcpp::interfaces() in the vignette.

So if you want to stick with Attributes that seems to be one way. Else call the function you want to call fworker(), have f1() call it (and f1() becomes available in R) and have f2() call fworker(). But you should be able to do better.

Otherwise, you can of course fall back to manually exporting the function using an explicitly created R wrapper.

like image 28
Dirk Eddelbuettel Avatar answered Nov 13 '22 14:11

Dirk Eddelbuettel