[Rd] Using lengthgets() correctly (was SET_LENGTH)
Prof Brian Ripley
ripley at stats.ox.ac.uk
Sun Apr 17 10:54:10 CEST 2005
I assume this is not true of your actual example, but the sample code
allocates a character matrix and calls INTEGER() on it. Ouch!
On Sun, 17 Apr 2005, Prof Brian Ripley wrote:
> If you use R not the S-compatibility macros you will be less likely to
> confuse yourself. The definition is (analogous to realloc)
>
> Rdefines.h:#define SET_LENGTH(x, n) (x = lengthgets(x, n))
>
> so x is changed and needs to be reprotected. [I don't know that
> SET_LENGTH *is* part of the API: it is not defined in `Writing R
> Extensions'.]
>
> Your error will potentially occur at the first garbage collection. Try using
> REPROTECT.
>
> Note though that what you are doing is very inefficient, and re-setting the
> length without changing the dim is also an error. What R's internal examples
> do is to allocate a modest vector, double in size when needed, call
> lengthgets to shorten at the end, then set the dim attribute.
>
> On Sat, 16 Apr 2005, Larry Tordsen wrote:
>
>> Hello.
>>
>> I'm trying to read a delimited file. I'm a little new
>> to the R api. In the program, I do something like
>> this...
>>
>> /*****************************/
>> SEXP retval;
>> PROTECT(retval = allocMatrix(STRSXP,1,names.dim));
>> int r_eltctr = 0;
>> while(!myfile.eof())
>> {
>> SET_LENGTH(retval,r_eltctr+num_of_fields);
>> for(int i = 0;numofcolumns; ++i)
>> {
>> INTEGER(retval)[r_eltctr++] = 1;/*some
>> value...*/
>> }
>> ++r_eltctr;
>> }
>> UNPROTECT(1);
>> /***************************************/
>>
>> There is a segmentation fault when SET_LENGTH() is
>> called several iterations into the program. It seems
>> like it should not be a memory issue, unless a
>> constraint is set by R. The vector only has about
>> 3500 elements at the time it crashes.
>>
>> Does anyone have any ideas what the problem could be?
>
> The problem seems to be the assumption that R (and not the user) was at
> fault.
>
> --
> 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
>
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
--
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