Dear all,
I am stuck at applying loop function for creating separated plots.
I have coding like below:
dataset.table <-
table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b")
))
kk = function(f)
{
ls=as.character(f)
pie(dataset.table[ls,],main=ls)
box()
}
kk(1)
kk(2)
kk(3)
By using above code, I can create 3 single plot respectively, but when I
type kk(1:3), obviously it will not work.
I know I have to vectorise the coding, then I can use command kk(1:3). I try
to use loop:
kk = function(f)
{
ls=as.character(f)
for (i in length(f))
{
pie(dataset.table[ls[i],],main=ls[i])
box()
}
}
kk(1:3)
the above code only gives me the last pie plot (ie. kk(3) plot) instead of 3
plots respectively.
Can someone please guide me how to revise the loop coding, and produce 3
separated plots one after another on the screen by typing kk(1:3)?
Thanks a lot.
Rene.
Rene wrote:> Dear all, > > I am stuck at applying loop function for creating separated plots. > > I have coding like below: > > dataset.table <- >table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b")> )) > kk = function(f) > { > ls=as.character(f) > pie(dataset.table[ls,],main=ls) > box() > } > > kk(1) > kk(2) > kk(3) > > By using above code, I can create 3 single plot respectively, but when I > type kk(1:3), obviously it will not work. > > I know I have to vectorise the coding, then I can use command kk(1:3). I > try to use loop: > > kk = function(f) > { > ls=as.character(f) > for (i in length(f)) > { > pie(dataset.table[ls[i],],main=ls[i]) > box() > } > } > kk(1:3) > > the above code only gives me the last pie plot (ie. kk(3) plot) instead of > 3 plots respectively. > > Can someone please guide me how to revise the loop coding, and produce 3 > separated plots one after another on the screen by typing kk(1:3)? > > Thanks a lot. > > Rene.Your code is probably doing what you want, but over-plotting the graphs so quickly, you only see the last one. Inserting readline("Hit <ENTER> to proceed.") after your "box()" statement might give you what you want. Joh
Hi Rene, the problem is probably due to the fact that R will send all plots to the same graphical output window. Each next plot just replaces the previous one. if it's only a few plots, you can divide the graphical window with the commands par(mfrow=...) (see ?par) or layout(matrix(...)) (see ?layout). Otherwise you have to ask the window to wait before refreshing. par(ask=TRUE) (see ?par as well) Hope this helps Cheers Joris On Mon, Oct 19, 2009 at 12:14 PM, Rene <kaixinmalea at gmail.com> wrote:> Dear all, > > I am stuck at applying loop function for creating separated plots. > > I have coding like below: > > dataset.table <- > table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b") > )) > kk = function(f) > ? ? ? ? ? ? { > ? ? ? ? ? ? ?ls=as.character(f) > ? ? ? ? ? ? ?pie(dataset.table[ls,],main=ls) > ? ? ? ? ? ? ?box() > ? ? ? ? ? ? } > > kk(1) > kk(2) > kk(3) > > By using above code, I can create 3 single plot respectively, but when I > type kk(1:3), obviously it will not work. > > I know I have to vectorise the coding, then I can use command kk(1:3). I try > to use loop: > > kk = function(f) > ? ? ? ? ? ? { > ? ? ? ? ? ? ?ls=as.character(f) > ? ? ? ? ? ? ?for (i in length(f)) > ? ? ? ? ? ? ?{ > ? ? ? ? ? ? ?pie(dataset.table[ls[i],],main=ls[i]) > ? ? ? ? ? ? ?box() > ? ? ? ? ? ? ?} > ? ? ? ? ? ? ?} > kk(1:3) > > the above code only gives me the last pie plot (ie. kk(3) plot) instead of 3 > plots respectively. > > Can someone please guide me how to revise the loop coding, and produce 3 > separated plots one after another on the screen by typing kk(1:3)? > > Thanks a lot. > > Rene. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Hi Rene,
two reasons :
- you have to specify the par first in your function, before plotting.
- you say for (i in length(f)), but length(f) is a vector with only
one value. The correct syntax is :
kk = function(f)
{
par(mfrow=c(1,length(f)))
ls=as.character(f)
for (i in 1:length(f))
{
pie(dataset.table[ls[i],],main=ls[i])
box()
}
}
There is another important problem : this function only works if
dataset.table is specified in your environment. I would do something
like this :
dataset.table <-
table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b")
))
kk = function(f,data=dataset.table)
{
par(mfrow=c(3,2))
ls=as.character(f)
for (i in 1:length(f))
{
pie(data[ls[i],],main=ls[i])
box()
}
}
kk(1:3)
newdata <-
table(data.frame(var1=c(1,2,3,1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b","c","b","a")
))
kk(1:3,data=newdata)
This allows you to use the function on other datasets, but you don't
have to specify your default dataset each time.
Cheers
Joris
On Mon, Oct 19, 2009 at 1:33 PM, Rene <kaixinmalea at gmail.com>
wrote:> Thanks Joris for the prompt reply.
>
> I have tried to use par(mfrow=(3,3)), then I type kk(1:3), but it still
ends
> up showing the last plot only instead of 3 plots.
>
> I think there must be sth wrong with my loop code, can you see where I did
> wrong?
>
> dataset.table <-
>
table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b")
> ))
> kk = function(f)
> ? ? ? ? ? ? {
> ? ? ? ? ? ? ?ls=as.character(f)
> ? ? ? ? ? ? ?for (i in length(f))
> ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ?pie(dataset.table[ls[i],],main=ls[i])
> ? ? ? ? ? ? ?box()
> ? ? ? ? ? ? ?}
> ? ? ? ? ? ? ?}
> par(mfrow=(3,2))
> kk(1:3)
>
>
> Thanks a lot!
>
> Rene
>
>
> -----Original Message-----
> From: joris meys [mailto:jorismeys at gmail.com]
> Sent: Tuesday, 20 October 2009 12:11 a.m.
> To: Rene
> Subject: Re: [R] loop and plot
>
> Hi Rene,
>
> the problem is probably due to the fact that R will send all plots to
> the same graphical output window. Each next plot just replaces the
> previous one.
>
> if it's only a few plots, you can divide the graphical window with the
> commands par(mfrow=...) (see ?par) or layout(matrix(...)) (see
> ?layout). Otherwise you have to ask the window to wait before
> refreshing. par(ask=TRUE) (see ?par as well)
>
> Hope this helps
> Cheers
> Joris
>
> On Mon, Oct 19, 2009 at 12:14 PM, Rene <kaixinmalea at gmail.com>
wrote:
>> Dear all,
>>
>> I am stuck at applying loop function for creating separated plots.
>>
>> I have coding like below:
>>
>> dataset.table <-
>>
>
table(data.frame(var1=c(1,2,3,1,2,3,1),colour=c("a","b","c","c","a","b","b")
>> ))
>> kk = function(f)
>> ? ? ? ? ? ? {
>> ? ? ? ? ? ? ?ls=as.character(f)
>> ? ? ? ? ? ? ?pie(dataset.table[ls,],main=ls)
>> ? ? ? ? ? ? ?box()
>> ? ? ? ? ? ? }
>>
>> kk(1)
>> kk(2)
>> kk(3)
>>
>> By using above code, I can create 3 single plot respectively, but when
I
>> type kk(1:3), obviously it will not work.
>>
>> I know I have to vectorise the coding, then I can use command kk(1:3).
I
> try
>> to use loop:
>>
>> kk = function(f)
>> ? ? ? ? ? ? {
>> ? ? ? ? ? ? ?ls=as.character(f)
>> ? ? ? ? ? ? ?for (i in length(f))
>> ? ? ? ? ? ? ?{
>> ? ? ? ? ? ? ?pie(dataset.table[ls[i],],main=ls[i])
>> ? ? ? ? ? ? ?box()
>> ? ? ? ? ? ? ?}
>> ? ? ? ? ? ? ?}
>> kk(1:3)
>>
>> the above code only gives me the last pie plot (ie. kk(3) plot) instead
of
> 3
>> plots respectively.
>>
>> Can someone please guide me how to revise the loop coding, and produce
3
>> separated plots one after another on the screen by typing kk(1:3)?
>>
>> Thanks a lot.
>>
>> Rene.
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
>