Re: [Rcpp-devel] Pass a function name as an argument.
Awesome. Thank you Baptiste! On Sat, May 18, 2013 at 4:32 PM, baptiste auguie 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 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 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 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>>> total+=x(i); return total/10; } double fun2(NumericVector x, int n){ double total=0; for(int i=0;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
Re: [Rcpp-devel] Pass a function name as an argument.
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 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 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 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>> total+=x(i); >>> return total/10; >>> } >>> >>> >>> double fun2(NumericVector x, int n){ >>> double total=0; >>> for(int i=0;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
Re: [Rcpp-devel] Pass a function name as an argument.
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 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 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> total+=x(i); >> return total/10; >> } >> >> >> double fun2(NumericVector x, int n){ >> double total=0; >> for(int i=0;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
Re: [Rcpp-devel] Pass a function name as an argument.
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 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 total+=x(i); > return total/10; > } > > > double fun2(NumericVector x, int n){ > double total=0; > for(int i=0;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] Pass a function name as an argument.
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___ 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