Re: [Rcpp-devel] Pass a function name as an argument.

2013-05-18 Thread Xiao He
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.

2013-05-18 Thread baptiste auguie
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.

2013-05-18 Thread Xiao He
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.

2013-05-18 Thread JJ Allaire
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.

2013-05-18 Thread Xiao He
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