Re: [R] Puzzled at ifelse()

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Tue 12 Jul 2005 - 20:32:50 EST

Ajay Narottam Shah wrote:
> I have a situation where this is fine:
>
> > if (length(x)>15) {
> clever <- rr.ATM(x, maxtrim=7)
> } else {
> clever <- rr.ATM(x)
> }
> > clever
> $ATM
> [1] 1848.929
>
> $sigma
> [1] 1.613415
>
> $trim
> [1] 0
>
> $lo
> [1] 1845.714
>
> $hi
> [1] 1852.143
>
> But this variant, using ifelse(), breaks:
>
> > clever <- ifelse(length(x)>15, rr.ATM(x, maxtrim=7), rr.ATM(x))
> > clever
> [[1]]
> [1] 1848.929
>
> What am I doing wrong?

if (test) expr1 else expr2

evaluates only one of expr1 or expr2 according to test, and returns that result.

ifelse(test, expr1, expr2)

executes all three of test, expr1, and expr2, and puts together a vector response where for each element of test that is true (non-zero), the corresponding element of one of the expr's is selected.

I'd guess your x is length 1, so your test is length 1, and only the first element of the result of rr.ATM is returned (which is not very useful).

To get what you want, you should write

clever <- if(length(x) > 15) rr.ATM(x, maxtrim=7) else rr.ATM(x);

Duncan Murdoch



R-help@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 Received on Tue Jul 12 20:39:36 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:33:31 EST