Last week Paul Gilbert asked about DUP=FALSE and whether parent environments can be affected. I have experimented and they can. Consider the R functions> ffunction(x){ .C("badidea",x,DUP=FALSE)}> gfunction(y) f(y)> hfunction(z){ z<-as.integer(z) g(z) z } and the C function void badidea(int *x){ *x=7; } This gives> h(4)[1] 7 so the modification of x in f() reaches up past g() to modify z in h(). The conclusion is that one should not pass a formal parameter of a function using DUP=FALSE if it might be modified. Assigning the parameter seems to be sufficient to prevent the problem: replacing g by g<-function(y) { w<-y f(w) } gives> h(4)[1] 4 as expected. -thomas Thomas Lumley Asst. Professor, Biostatistics tlumley@u.washington.edu University of Washington, Seattle -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Thomas Thanks for verifying that this actually does work the way you thought it did. In the example I asked about (qr.qty ) I am fairly sure that it does not modify the y argument. Unfortunately this seems relatively difficult to trace for certain, and experimenting works but may not hit all cases. Another thing I find I do not understand is how many copies of an argument are made. For example, in a call to a function like f <- function(x){ .C("goodidea", y=double(1), x, DUP=TRUE)[[y]] } there is the original x and the duplicated x in the argument to .C, but is there a third in the list returned by .C, or is that somehow the same one as in the argument to .C. My problem is that my x is very big. Thanks, Paul Gilbert -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._