Re: [R] Why doesn't this work ?

From: Ted Harding <ted.harding_at_wlandres.net>
Date: Thu, 17 Mar 2011 10:23:52 +0000 (GMT)


And, just to make it really clear (I hope!):

Your original expression
  z <-ifelse(t==1 || 2 || 3, 1,0)
looks like a transcription into "R" of the words

  "If t equals 1 or 2 or 3 then z is 1 else z is 0"

However, your "t==1 || 2 || 3" has to be parsed in the correct order according to operator precedence. If you look at '?Syntax' you will see that operator '==' has precedence over the "or" operator '||'. Hence the expression "t==1 || 2 || 3" will be parsed as

  (t==1) || 2 || 3

So, whatever the value of 't' ("t==1" may be either TRUE or FALSE), the result will be either

  TRUE || 2 || 3
or
  FALSE || 2 || 3 When numeric values (like "2" or "3") occur in a logical expression, they are coerced to a logical TRUE (with the one exception that a numerical value of "0" is coerced to FALSE). Hence, whatever the outcome of "t==1" the result will be either

  TRUE || TRUE || TRUE
or
  FALSE || TRUE || TRUE which is always TRUE. This explains your results. Bill and Phil have given you an alternative which works: "t %in% (1:3)". A way of writing it (though longer) which is closer to your original "wording" could be

  if( (t==1) || (t==2) || (t==3) , 1, 0)

which really spells out how to force the parsing.

Hoping this helps,
Ted.

On 17-Mar-11 03:54:32, Bill.Venables_at_csiro.au wrote:
> It doesn't work (in R) because it is not written in R. It's written in
> some other language that looks a bit like R.
>

>> t <- 3
>> z <- t %in% 1:3
>> z

> [1] TRUE
>> t <- 4
>> z <- t %in% 1:3
>> z

> [1] FALSE
>
> -----Original Message-----
> From: r-help-bounces_at_r-project.org
> [mailto:r-help-bounces_at_r-project.org] On Behalf Of eric
> Sent: Thursday, 17 March 2011 1:26 PM
> To: r-help_at_r-project.org
> Subject: [R] Why doesn't this work ?
>
> Why doesn't this work and is there a better way ?
>
> z <-ifelse(t==1 || 2 || 3, 1,0)
> t <-3
> z
> [1] 1
> t <-4
> z
> [1] 1
>
> trying to say ...if t == 1 or if t== 2 or if t ==3 then true, otherwise
> false
>
> --
> View this message in context:
> http://r.789695.n4.nabble.com/Why-doesn-t-this-work-tp3383656p3383656.ht
> ml
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> 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.
>
> ______________________________________________
> 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.


E-Mail: (Ted Harding) <ted.harding_at_wlandres.net> Fax-to-email: +44 (0)870 094 0861
Date: 17-Mar-11                                       Time: 10:13:53
------------------------------ XFMail ------------------------------

______________________________________________
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. Received on Thu 17 Mar 2011 - 10:27:13 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 17 Mar 2011 - 11:50:22 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive