[Rd] C-Side: Applying a function (given as param) to data (given as param)

Duncan Murdoch murdoch.duncan at gmail.com
Sat Jun 4 13:51:08 CEST 2011


On 11-06-03 4:19 PM, oliver wrote:
> On Fri, Jun 03, 2011 at 11:14:39AM -0500, Douglas Bates wrote:
>> On Fri, Jun 3, 2011 at 5:17 AM, oliver<oliver at first.in-berlin.de>  wrote:
>>> Hello,
>>>
>>> I'm implementing a package (C-extension),
>>> where one function gets data and a function
>>> that needs to be applied to the data.
>>>
>>> I want to apply the function to (parts of)
>>> the data on the C-side.
>>>
>>> 1) how do I apply a function (given via SEXP) to data
>>> 2) how do I select parts of the data (also provided via SEXP)?
>>
>> Not to be facetious but you begin by reading the "Writing R Extensions" manual.
>
> I already read inside it.
> If there would be no question open i would not have registered to this mailing list
> and woulod not have asked that question.
> Obviously my question was not answered in the "Writing R Extensions",
> so if you can give me a hint this would be nice.
>
>
>>
>> An alternative is to read the vignette Rcpp-Introduction available as
>> http://dirk.eddelbuettel.com/code/rcpp/Rcpp-introduction.pdf and soon
>
> I use C, not C++.
>
> But maybe it helps too.
>
> I already created my own package with R and C successfully some days ago.
>
> But so far I did not used fucntion pointers coming in via SEXP parameters.
>
> And that was my specific question.
>
>
>
>
>> to be in The R Journal.  They show an explicit example of apply in
>> compiled code (C++ using the Rcpp structures, in their case).
>
>
> As just mentioned: I already created successfully a C-extension for R.
>
> But I would like to know, how to call a function that I get via
> SEXP as parameter. How can I find out the function definition,
> for example the arity of the function and which arguments
> a function uses.

You should almost certainly do this in R, not in C.  If you are doing it 
in C code you'll just be duplicating the implementation from R, and your 
code will break if that implementation ever changes.

In R you use formals(fn) to extract the function header.

>
> The problem is, that the C-standard (at least the first ANSI-C standard)
> does not guarantee portability for C-pointers.
> To be portable, for example the function pointer you use must
> definitely be of same type as the function you use.
>
> So I need to know how I can use the SEXP-function pointers.

They are not function pointers, they are pointers to R objects.

Duncan Murdoch

>
>
> To be more concrete, this is how my function's API looks like
> at the moment:
>
> SEXP movapply( SEXP data, SEXP width, SEXP func )
> {
>    /* some code */
>
>    return ( result );
> }
>
>
>
>    data   will be vector or list or matrix
>    width  will be int value (I think vector of length 1)
>    func   will be a function pointer of the type that is given as argument
>
> I don't know on which kind of pointer to cast.
> I think I will cast to a pure C-type, but then all data also must
> match to the function definition.
>
> What if the function wants to work on integer, but the data is double?
>
> Somehow this must be handled, and I think the experts here can just point me
> directly to some kind of docs or maybe older postinmgs here, which explain this?
>
>
> Ciao,
>     Oliver
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list