.Call question
On Wed, 26 Jul 2006, Rossi, Peter E. wrote:
Writing R Ext says to treat R objects that are arguments to .Call as read only (i.e. don't modify). I have a long list of lists that and I want to avoid the overhead of a copy in my C code. I would just like to modify some of the elements of list by replacing them with elements of exactly the same size/type. below is an example of the essence of the problem. This seems to work. Is this dangerous or ok? (of course, I want to do something more complicated since I can do this in R, but I hope this illustrates my question).
It is dangerous.
If you do
lst1<-list("a","b","c")
lst2<-lst1
element<-"d"
.Call("modlist",lst1, 1, element)
then both lst1 and lst2 will change. The danger is just that you can
break the call-by-value illusion that R maintains, in two ways. The first
is that objects that have shared structure can be modified, the
second is that you can create shared structure without R knowing: if you
change "element" subsequently then lst1 and lst2 may change.
-thomas
SEXP modlist(SEXP list, SEXP ind, SEXP element){
int index;
index=INTEGER_VALUE(ind);
SET_ELEMENT(list,index,element);
return(ind);
}
called in R as in
lst=list("a","b","c")
element="d"
out=.Call("modlist",lst,1,element)
here the .Call is used just for its effect on lst.
thanks!
peter
................................
Peter E. Rossi
Joseph T. and Bernice S. Lewis Professor of Marketing and Statistics
Editor, Quantitative Marketing and Economics
Rm 353, Graduate School of Business, U of Chicago
5807 S. Woodlawn Ave, Chicago IL 60637, USA
Tel: (773) 702-7513 | Fax: (773) 834-2081
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle