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 <praguewaterme...@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.alla...@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 <praguewaterme...@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@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@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@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel