[R] Avoiding a memory copy by [[

Matthew Dowle mdowle at concordiafunds.com
Tue May 23 19:16:49 CEST 2006


That development sounds excellent. I'm happy to help test it, just let me
know.

Until 2.4.0 then I'll do something like the following, because I need to
deal with list integer locations rather than names :

	eval(parse(text=paste("L$'",names(L)[2],"'[1:10]",sep="")))

This works well but if there is an easier way until 2.4.0, please let me
know.

Thank you and Henrik for your replies.


> -----Original Message-----
> From: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk] 
> Sent: 23 May 2006 17:47
> To: Henrik Bengtsson
> Cc: Matthew Dowle; r-help at stat.math.ethz.ch
> Subject: Re: [R] Avoiding a memory copy by [[
> 
> 
> On Tue, 23 May 2006, Henrik Bengtsson wrote:
> 
> > On 5/23/06, Matthew Dowle <mdowle at concordiafunds.com> wrote:
> >> 
> >> Thanks.
> >> 
> >> I looked some more and found that L$b[1:10] doesn't seem 
> to copy L$b.  
> >> If that's correct why does L[[2]][1:10] copy L[[2]] ?
> >
> > I forgot, this is probably what I was told in discussion about
> > UseMethod("$") the other day: The "$" operator is very special. Its 
> > second argument (the one after the operator) is not evaluated.  For 
> > "[[" it is.  This is probably also why the solution with 
> environment 
> > works.  I think some with the more knowledge about the R 
> core has to 
> > give you the details on this, and especially why "$" is 
> special in the 
> > first place (maybe because of the example you're giving).
> 
> That's not the reason here: the internal code for [[ 
> duplicates for vector 
> lists but not pairlists.  That could be replaced by a NAMED 
> optimization, 
> although we would not do that until 2.4.0 (for which Thomas 
> Lumley has 
> written profiling code for memory use and duplication).
> 
> >
> > /Henrik
> >
> >> > -----Original Message-----
> >> > From: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk]
> >> > Sent: 23 May 2006 16:23
> >> > To: Matthew Dowle
> >> > Cc: 'r-help at stat.math.ethz.ch'
> >> > Subject: Re: [R] Avoiding a memory copy by [[
> >> >
> >> >
> >> > On Tue, 23 May 2006, Matthew Dowle wrote:
> >> >
> >> > >
> >> > > Hi,
> >> > >
> >> > > n = 10000000
> >> > > L = list(a=integer(n), b=integer(n))
> >> > >
> >> > > L[[2]][1:10]  gives me the first 10 items of the 2nd vector in 
> >> > > the list L. It works fine.  However it appears to copy the
> >> > entire L[[2]]
> >> > > vector in memory first, before subsetting it.  It seems 
> >> > > reasonable that "[[" can't know that all that is to be 
> done is to 
> >> > > do [1:10] on the result and therefore a copy in memory of the 
> >> > > entire
> >> > vector L[[2]]
> >> > > is not required.  Only a new vector length 10 need be
> >> > created.  I see
> >> > > why [[ needs to make a copy in general.
> >> > >
> >> > > L[[c(2,1)]]  gives me the 1st item of the 2nd vector in the
> >> > list L.
> >> > > It works fine,  and does not appear to copy L[[2]] in
> >> > memory first.
> >> > > Its much faster as n grows large.
> >> > >
> >> > > But I need more than 1 element of the vector ....
> >> > L[[c(2,1:10)]]   fails
> >> > > with "Error: recursive indexing failed at level 2"
> >> >
> >> > Note that [[ ]] is documented to only ever return one 
> element, so 
> >> > this is invalid.
> >> >
> >> > > Is there a way I can obtain the first 10 items of 
> L[[2]] without 
> >> > > a memory copy of L[[2]]  ?
> >> >
> >> > Use .Call
> >> >
> >> > --
> >> > Brian D. Ripley,                  ripley at stats.ox.ac.uk
> >> > Professor of Applied Statistics,  
> http://www.stats.ox.ac.uk/~ripley/
> >> > University of Oxford,             Tel:  +44 1865 272861 (self)
> >> > 1 South Parks Road,                     +44 1865 272866 (PA)
> >> > Oxford OX1 3TG, UK                Fax:  +44 1865 272595
> >> >
> >> 
> >> ______________________________________________
> >> R-help at stat.math.ethz.ch mailing list 
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guide!
> >> http://www.R-project.org/posting-guide.html
> >> 
> >> 
> >
> >
> 
> -- 
> Brian D. Ripley,                  ripley at stats.ox.ac.uk
> Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
> University of Oxford,             Tel:  +44 1865 272861 (self)
> 1 South Parks Road,                     +44 1865 272866 (PA)
> Oxford OX1 3TG, UK                Fax:  +44 1865 272595
>



More information about the R-help mailing list