First, thanks to those of you who responded to my previous post about my code that was taking longer and longer to process. After following your suggestions, and I now thinking that the problem was some calls to Rf_duplicate in my C code. So I'm hoping I could get some clarification on what Rf_duplicate actually does. What is the real difference between PROTECT(y=x); and PROTECT (y = duplicate(x)); ? I do use duplicate on the list objects that are passed directly from R, since in the passed, I got some odd results of the original lists being changed (when I didn't want them to be). So suppose that x is the list that is passed from R to the C code. Is there any (conceivable) reason that I might want to do something like PROTECT(y = duplicate(x)); PROTECT(z = duplicate(VECTOR_ELT(y,2))); Instead of PROTECT(y=duplicate(x)); PROTECT(z = VECTOR_ELT(y,2)); And if I did create a duplicate, is there a way to destroy it manually before the end of the function, rather than rely on on the R garbage collector? Thanks, Michael Michael Braun Assistant Professor of Marketing MIT Sloan School of Management One Amherst St., E40-169 Cambridge, MA 02142 (617) 253-3436 braunm@mit.edu [[alternative HTML version deleted]]
> PROTECT(y=x); andThis has no sense as y is just the same pointer as x. By doing this you did not create any new data, if you modify y, x will be modified. y does not need protection as x is probably protected.> PROTECT (y = duplicate(x)); ?This will allocate new memory for data in x and copy data over there. This is correct, modifying y will not modify x. And y needs protection as it is newly allocated.> PROTECT(y = duplicate(x)); > PROTECT(z = duplicate(VECTOR_ELT(y,2)));It is not clear what you want to achieve by this. z will not be part of y any more> PROTECT(y=duplicate(x)); > PROTECT(z = VECTOR_ELT(y,2));The correct way would be PROTECT(y=duplicate(x)); z = VECTOR_ELT(y,2); as you do not need to protect z, it is done by protecting y> And if I did create a duplicate, is there a way to destroy it manually > before the end of the function, rather than rely on on the R garbage > collector?Not that I know about. Best, Oleg -- Dr Oleg Sklyar | EBI-EMBL, Cambridge CB10 1SD, UK | +44-1223-494466