Write Barrier: was: [Rd] function-like macros undefined

Vadim Ogranovich vograno at evafunds.com
Wed Mar 16 19:34:56 CET 2005


Hi,

Thank you to Duncan Murdoch for pointing to
http://www.stat.uiowa.edu/~luke/R/barrier.html.
I have a couple of questions in this regard:

* suppose that inside a C function I have a SEXP vector x of integers
and I want to increment each element by one. I understand that

int * xIPtr = INTEGER(x);
int i;

for (i=0; i<LENGTH(x); ++i)
     SET_VECTOR_ELT(x, i, xIPtr[i]+1);


is the recommended way of doing it. However it seems that only the very
first call to SET_VECTOR_ELT, i.e. the one that corresponds to i=0, is
strictly necessary. For example, and this is my question, the following
should be perfectly safe:

SET_VECTOR_ELT(x, 0, xIPtr[0]);

for (i=0; i<LENGTH(x); ++i)
     ++xIPtr[i];


Admittedly this looks a bit odd and breaks if LENGTH(x) is zero, but it
illustrates the point.

* Now, if the above variation is safe, maybe there is a macro that
simply marks atomic SEXP-s, i.g. integers and doubles, for modification?

* The "Write Barrier" document has a section "Changing the
Representation of String Vectors". Is this something which is in works,
or planned, for future versions? It would be great if it were, this
should give R considerable speed boost.

Thanks,
Vadim



More information about the R-devel mailing list