[R] Incrementing a counter in lapply

Gabor Grothendieck ggrothendieck at gmail.com
Tue Mar 14 15:06:17 CET 2006


There are two ways to do that: one is to use mapply as Thomas
showed and the other is to iterate over an index rather than over
the data itself.  Here is a rather lame example using + but hopefully
it conveys the idea of the two possibilities:

# 1
x <- y <- 1:4
mapply("+", x, y)

# 2
sapply(seq(along = x), function(i) x[i]+y[i])

On 3/14/06, John McHenry <john_d_mchenry at yahoo.com> 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.
>
> 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!
>
>




More information about the R-help mailing list