Re: [R] correct C function usage

From: Martin Maechler <>
Date: Wed 14 Dec 2005 - 21:20:02 EST

>>>>> "Ido" == Ido M Tamir <> >>>>> on Wed, 14 Dec 2005 10:37:07 +0100 writes:

    Ido> On Tuesday 13 December 2005 22:35, you wrote:
>> On Tue, 13 Dec 2005, Ido M. Tamir wrote:
>> > Hello,
>> > I am not sure if I am interfacing with C correctly and _safely_
>> > or if there is a better way esp. with regards to terminating
>> > the "returned" array.
>> You need to pass the length to the C routine and check you do not
>> overwrite it. (As in the parts you -snip-ed below.)

>> > testFillC <- function(a){
>> > .C("testFill", as.integer(a), newvalues=integer(length(a)),
>> > endposition=integer(1))
>> > }
>> What do testFillC(1) or testFillC(logical(0)) do?
    Ido> Thats undefined - probably a segmentation fault.

    Ido> Thank you very much for your answers.

    Ido> I was trying to cut down my actual function so readers could focus
    Ido> on what I was seeing as the main problem: terminating the array.
    Ido> I was hoping that somebody would tell me that I only have to terminate
    Ido> the array in the C function somehow and the R part would recognize
    Ido> that automagically - and no more passing lengths explicitly around and 
    Ido> copying arrays up to  length .............

    Ido> .............

If you want this (and for other reasons), the use of .Call() instead of .C() is highly recommended.

With .Call() you get proper "R objects" on the C side which you can "interrogate" for LENGTH() but also any other attributes(). On return, the result of .Call() can be any R object you might want to construct from C.

Doug Bates (and many others) has found this to be particularly fruitful when working with S4 class objects. And of course, that has been designed to work like this by John Chambers himself at the time S4 was designed and "The Green Book" was written. AFAIK, .Call() was part of the S4 wave (with which I mean other innovations than just the S4 OO system).

Martin Maechler, ETH Zurich mailing list PLEASE do read the posting guide! Received on Wed Dec 14 21:40:15 2005

This archive was generated by hypermail 2.1.8 : Wed 14 Dec 2005 - 23:40:09 EST