[R] Incrementing a counter in lapply

Thomas Lumley tlumley at u.washington.edu
Tue Mar 14 16:42:33 CET 2006


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....]

 	-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




More information about the R-help mailing list