[Rcpp-devel] Pass a function name as an argument.
Awesome. Thank you Baptiste! On Sat, May 18, 2013 at 4:32 PM, baptiste auguie
<baptiste.auguie at gmail.com>wrote:
Hi, I asked the same thing once, and Dirk came up with some helpful ideas and a whipped up a demo for the gallery http://stackoverflow.com/questions/14428687/rcpparmadillo-pass-user-defined-function http://gallery.rcpp.org/articles/passing-cpp-function-pointers/ HTH, baptiste On 18 May 2013 19:00, Xiao He <praguewatermelon at gmail.com> wrote:
Hi JJ, Thank you for the reply. I would actually like to pass C++ functions to the C++ function foo(). To be more specific, the user will indicate in the R environment which of the two functions (fun1 or fun2) to pass to foo(). foo() will somehow use the chosen one accordingly. I suppose one option is to wrap foo() inside another function. The wrapper function can take input from the user from R, and then based on what the input is choose the appropriate function (fun1 or fun2). But the question of how to pass functions with different numbers of arguments still remains. I wonder if you have any thoughts. Thank you again! Best, Xiao On Sat, May 18, 2013 at 12:45 PM, JJ Allaire <jj.allaire at gmail.com>wrote:
Hi Xiao, The problem is that sourceCpp can only accept arguments of types that can be converted to R using Rcpp::as (this is detailed in the help topic for sourceCpp and in the Rcpp vignettes). Plain C function pointers aren't convertible in this fashion so the compilation fails. If your intention is to pass an R function to C++ you can however use the Rcpp::Function type in your signature. This is explained in more detail in this Rcpp Gallery article: http://gallery.rcpp.org/articles/r-function-from-c++/ J.J. On Sat, May 18, 2013 at 1:31 PM, Xiao He <praguewatermelon at gmail.com>wrote:
Hi everyone, I have two questions regarding passing a function name as
an argument.
(1). Suppose that I have a function foo() shown below. The function
takes a NumericVector and a function pointer that points to a function that
takes a NumericVector and returns a double. Note that the function pointer
will only point to functions not exposed to R.
double foo(NumericVector x, double (*f)(NumericVector x) ){
double output;
output=(*f)(x);
return output;
}
When I try to compile it as is using sourceCpp(), it's fine, but when I
add "// [[Rcpp::export]]" above the function definition, I get an error
message:
Error in sourceCpp("foo.cpp") :
Error 1 occurred building shared library.
foo.cpp:229: error: expected initializer before ?SEXP?
So I wonder how I can fix this mistake.
(2). Imagine a more complex scenario: suppose there are two functions
available to be passed to foo(). But the two functions differ in the number
of arguments each has (see fun1() and fun2() below). I wonder if there is
any way to deal with this.
double fun1(NumericVector x){
double total=0;
for(int i=0;i<x.size();i++)
total+=x(i);
return total/10;
}
double fun2(NumericVector x, int n){
double total=0;
for(int i=0;i<x.size();i++)
total+=x(i)+add;
return total/n;
}
Thank you in advance!
Best,
-Xiao
_______________________________________________ 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
_______________________________________________ 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
-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130518/09b597a8/attachment.html>