[R] correct C function usage

Martin Maechler maechler at stat.math.ethz.ch
Wed Dec 14 11:20:02 CET 2005


>>>>> "Ido" == Ido M Tamir <tamir at imp.univie.ac.at>
>>>>>     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




More information about the R-help mailing list