[R] Puzzled at ifelse()
Duncan Murdoch
murdoch at stats.uwo.ca
Tue Jul 12 12:32:50 CEST 2005
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
More information about the R-help
mailing list