On 07/07/2010 7:32 PM, Gabor Grothendieck wrote:
On Wed, Jul 7, 2010 at 7:22 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:
On 07/07/2010 5:58 PM, karena wrote:
Hi, I am a newbie of R, and playing with the "ifelse" statement.

I have the following codes:
## first,

for(i in 1:3) {
for(j in 2:4) {
cor.temp <- cor(iris.allnum[,i], iris.allnum[,j])
if(i==1 & j==2) corr.iris <- cor.temp
else corr.iris <- c(corr.iris, cor.temp)
}
}

this code is working fine.

I also tried to perform the same thing in another way with "ifelse":
for(i in 1:3) {
for(j in 2:4) {
cor.temp <- cor(iris.allnum[,i], iris.allnum[,j])
corr.iris <- ifelse(i==1 & j==2, cor.temp, c(corr.iris, cor.temp))
}
}

This is not working. Seems the value of "c(corr.iris, cor.temp)" has not
been assigned to corr.iris, even  when the (i==1 & j==2) is not satisfied.

what's the problem here?
See ?ifelse.  It computes something the same shape as the test object.  In
your case the test is the result of

i==1 & j==2

and is a scalar that is either TRUE or FALSE, so the result of ifelse() will
be a scalar too.

To do what you want in one line, you can use

corr.iris <- if (i==1 && j==2) cor.temp else c(corr.iris, cor.temp)

but to most people this looks unnatural, and your original code is what I'd
recommend using.  In this case it makes no difference whether you use & or
&& in the test, but in other cases only && makes sense with if, and only &
makes sense with ifelse().

Just to quibble I find the

   corr.iris <- if ...

construct easier to understand than

   if (...) corr.iris <- ... else corr.iris <- ...

because in the first case you immediately see that the purpose of the
construct is to set corr.iris whereas setting it separately in each
leg requires that you must examine more code, i.e. both legs, to make
such a determination adding to the mental load.

Well, I did say "most people", not "all people". The reason I think most people prefer the separate statement is that they don't realize that "if (test) value1 else value2" is just a different way to write the function call "`if`(test, value1, value2)", they think of it as a flow-of-control statement, as it is in languages like C.

Duncan Murdoch

______________________________________________
R-help@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.

Reply via email to