[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