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;
}
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With