[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