Thanks! I found, say, exp(x) causes 2 duplications whereas sum(x) 0 duplication. Is there any document to learn from about this?
(first time list user. sorry if anything about the posting procedure is wrong) On Wed, Mar 9, 2011 at 6:16 PM, Matt Shotwell <m...@biostatmatt.com> wrote: > On Wed, 2011-03-09 at 17:15 -0900, Zepu Zhang wrote: > > Hello list, > > > > I have the following scenario: > > > > f1 <- function(a) > > { > > .... # doing things; may need 'a', but does not change 'a'. > > > > g <- function(x) > > { > > sum(x + a) # Say. Use 'a'; does not change 'a'. > > The expression 'x + a' causes 'a' to be duplicated; 'x' is added to each > element of the duplicated vector, then returned. The sum occurs > afterward. To avoid this use an expression like: 'length(a) * x + > sum(a)'. Also, please see this recent thread regarding the > pass-by-value / pass-by-reference issue: > http://tolstoy.newcastle.edu.au/R/e13/help/11/03/6632.html > > > } > > > > optimize(f = g, lower = 0, upper = 1) > > } > > > > > > f2 <- function() > > { > > b <- runif(100000000000) # Create big object. > > > > f1(a = b) > > } > > > > > > My main concern is to reduce copying of the big object 'a'. Questions: > > > > (1) In f1, 'a' never appears on the LHS of assignment. Is it passed by > value > > or by reference? Say the situation is simpler and more general: no > > optimization call in f1. > > 'a' is passed by value, but not necessarily copied in memory. > > > (2) Is there any difference, as far as copying of the big 'a' is > concerned, > > if 'g' is changed to > > g <- function(x, b) { sum(x + b) } > > and called by > > optimize(f = g, lower = 0, upper = 1, b = a) > > No. > > > (3) Is 'a' passed into the C optimization function one-off, or again and > > again across the C-R interface? > > I don't think either is completely correct. But more to your point, 'a' > is not necessarily copied repeatedly. If you make the substitution I > suggested above for 'g', then 'a' is not repeatedly copied. > > > (4) Does it help if I remove the argument 'a' of 'f1', and let 'g' look > for > > it (of course it should be referred to as 'b' now) directly in the > > environment of 'f2'? > > No. 'g' would then search and find 'a' farther down the environment > tree. > > > (5) Any suggestions? > > Avoid operations that necessitate a copy. Compile R with > --enable-memory-profiling and use the tracemem function to help in this. > > > Many thanks for your help! > > > > Zepu > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-devel@r-project.org mailing list > > https://stat.ethz.ch/mailman/listinfo/r-devel > > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel