[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