[R] Incrementing a counter in lapply

Liaw, Andy andy_liaw at merck.com
Tue Mar 14 16:50:28 CET 2006


From: Thomas Lumley
> 
> On Tue, 14 Mar 2006, John McHenry wrote:
> 
> > Thanks, Gabor & Thomas.
> >
> > Apologies, but I used an example that obfuscated the question that I
> > wanted to ask.
> >
> > I really wanted to know how to have extra arguments in 
> functions that
> > would allow, per the example code, for something like a 
> counter to be 
> > incremented. Thomas's suggestion of using mapply 
> (reproduced below with 
> > corrections) is probably closest.
> 
> It is probably worth pointing out here that the R 
> documentation does not 
> specify the order in which lapply() does the computation.
> 
> If you could work out how to increment a counter (and you could, with 
> sufficient effort), it would not necessarily work, because the 'i'th 
> evaluation would not necessarily be of the 'i'th element.
> 
> [lapply() does in fact start at the beginning, go on until it 
> gets to the 
> end, and then stop, but this isn't documented.   Suppose R became 
> multithreaded, for example....]

The corollary, it seems to me, is that sometimes it's better to leave the
good old for loop alone.  It's not always profitable to turn for loops into
some *apply construct.  The trick is learning to know when to do it and when
not to.

Andy

 
>  	-thomas
> 
> 
> >
> > Jack.
> >
> > PS Here's the corrected code:
> >
> >    d<- data.frame(read.table(textConnection("
> >         Y     X     D
> >                85    30     0
> >                95    40     1
> >                90    40     1
> >                75    20     0
> >           100    60     1
> >                90    40     0
> >                90    50     0
> >                90    30     1
> >               100    60     1
> >                85    30     1"
> >    ), header=TRUE))
> >    windows(); plot(Y ~ X, d, type="n")
> >    colors<- c("blue","green")
> >    junk<- mapply(
> >        function(z,color) with(z, lines(X, predict(lm(Y~X)), 
> col=color)),
> >        with(d, split(d,D)),
> >        color=colors
> >    )
> >
> >
> >
> >
> > Thomas Lumley <tlumley at u.washington.edu> wrote:
> > You can't get lapply to increment i, but you can use mapply 
> and write 
> > your function with two arguments.
> >
> > mapply( function(z,colour) with(z, lines(X, 
> predict(lm(Y~X), col=colour)),
> >         with(d, split(d,D)),
> >         colors)
> >
> >
> >
> >  -thomas
> >
> >
> > Gabor Grothendieck <ggrothendieck at gmail.com> wrote: Try this:
> >
> > plot(Y ~ X, d, type = "n")
> > f <- function(i) abline(lm(Y ~ X, d, subset = D == i), col = 
> > colors[i+1]) junk <- lapply(unique(d$D), f)
> >
> >
> >
> >
> > On 3/13/06, John McHenry  wrote:
> >>    Hi All,
> >>
> >>    I'm looking for some hints on idiomatic R usage using 
> 'lapply' or similar.
> >>    What follows is a simple example from which to generalize my 
> >> question...
> >>
> >>    # Suppose, in this simple example, I want to plot a 
> number of different lines in different colors;
> >>    # I define the colors I wish to use and I plot them in a loop:
> >>    d<- data.frame(read.table(textConnection("
> >>         Y     X     D
> >>                85    30     0
> >>                95    40     1
> >>                90    40     1
> >>                75    20     0
> >>           100    60     1
> >>                90    40     0
> >>                90    50     0
> >>                90    30     1
> >>               100    60     1
> >>                85    30     1"
> >>    ), header=TRUE))
> >>    # graph the relation of Y to X when
> >>    #     i)  D==0
> >>    #     ii) D==1
> >>    with( d, plot(X, Y, type="n") )
> >>    component<- with( d, split(d, D) )
> >>    colors<- c("blue", "green")
> >>    for (i in 1:length(component))
> >>        with( component[[i]], lines(X, predict(lm(Y ~ X)), 
> >> col=colors[i]) )
> >>
> >>    #
> >>    # ... seems easy enough
> >>    #
> >>    # [Q.]: How to do the same as the above but using 'lapply'?
> >>    # ... i.e. something along the lines of:
> >>    with( d, plot(X, Y, type="n") )
> >>    colors<- c("blue", "green")
> >>    # how do I get lapply to increment i?
> >>    lapply( with(d, split(d, D)), function(z) with(z, lines(X, 
> >> predict(lm(Y ~ X)), col=colors[i])) )
> >>
> >> Thanks,
> >>
> >> Jack.
> >>
> >>
> >>
> >> ---------------------------------
> >>
> >>
> >>        [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> 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
> >>
> >
> >
> >
> > ---------------------------------
> > Relax. Yahoo! Mail virus scanning helps detect nasty viruses!
> 
> Thomas Lumley			Assoc. Professor, Biostatistics
> tlumley at u.washington.edu	University of Washington, Seattle
> 
> ______________________________________________
> 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