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]]
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
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 <john_d_mchenry at yahoo.com> 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 >
From: Thomas Lumley> > 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....]The corollary, it seems to me, is that sometimes it's better to leave the good old for loop alone. It's not always profitable to turn for loops into some *apply construct. The trick is learning to know when to do it and when not to. Andy> -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 > > ______________________________________________ > 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 > >