[Rd] returning vectors of unknown size from C (with .C)

Prof Brian Ripley ripley at stats.ox.ac.uk
Sat Apr 26 11:38:18 CEST 2008


On Sat, 26 Apr 2008, Ramon Diaz-Uriarte wrote:

> On Sat, Apr 26, 2008 at 3:19 AM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
>> Ramon Diaz-Uriarte wrote:
>>
>>> Dear All,
>>>
>>> In a package, I am using ".C" to call some C functions. In one case,
>>> the number of elements of the return vectors are not known in R before
>>> the C call. (Two of the vectors are integers, the third is vector of
>>> character strings).
>>>
>>> Passing from R a vector of the maximum possible size would be a huge
>>> waste. I understand one alternative is to use ".Call", but I'd rather
>>> avoid it if I can (all of the code seems working except for the return
>>> of values into R). Another would be to write to a file from C and then
>>> read that into R, but this looks very ugly. Are there any other
>>> reasonable alternatives, or should I just use .Call?
>>>
>>>
>>
>>  .Call is usually easiest, but another possibility is to have two entry
>> points:  one to calculate how much space you need, a second to pass in a
>> vector that's the right size to hold the result.
>>
>
>
> You mean making two successive calls to the C code? The problem is
> that the size of the result is not known until the result is obtained
> (in my C code, the underlying structure is a linked list that gets
> stretched as needed as the computation proceeds). So I would not know
> "where to leave the result from C" in between the two calls to C.

But that is possible (you malloc the memory for a local copy in the rist 
call), and rpart does something like it.


-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list