returning vectors of unknown size from C (with .C)
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