[R] Incrementing a counter in lapply

Thomas Lumley tlumley at u.washington.edu
Mon Mar 13 19:50:10 CET 2006


On Mon, 13 Mar 2006, 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])) )
>

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




More information about the R-help mailing list