[R] Avoiding a memory copy by [[

Henrik Bengtsson hb at stat.berkeley.edu
Tue May 23 18:37:02 CEST 2006


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).

/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
>
>



More information about the R-help mailing list