[EMAIL PROTECTED] wrote:

I know I can do it with
t[(u==5)&(!is.na(u))]
but in the situation I am dealing with this leads to massively
cumbersome, typo-prone and hard-to-read code.

You could redefine '[' or '==', but that would lead to massively dangerous code. Anything could happen. Anyone who writes code that redefines such basic stuff may need their head examined.


I think you are going to have to work round it with the !is.na(u) thing, but you could wrap it up in a function:

true4sure<-function(v){v & !is.na(v)}

then

> t[true4sure(u==5)]
[1] 5

although perhaps you could give it a less whimsical name....

Also, as an extra, it would be very useful if, for instance,
t[u==NA] --> 2 4 6 8
(I realise that working round this is less cumbersome, but even so).

Here is a way of doing that. It redefines '=='. It will break things that depend on NA's remaining NA's in comparisons. Do not use this code. Do not even let it pollute your files. Consider it a dangerous virus:


assign("==",function(a,b){a[is.na(a)]<-FALSE; b[is.na(b)]<-FALSE; get("==","package:base")(a,b)})

and then you get:


c(1,2,3,NA,NA,NA) == c(1,NA,2,NA,NA,4)
[1] TRUE FALSE FALSE TRUE TRUE FALSE

Instead of that, since NA is one of the three values TRUE, FALSE, NA
of a logical, I'd like to be able to (a) treat NA as FALSE, (b) test
for a match between NA (as specified by me) and NA (as the value of
a logical variable).

Thats what it does. Of course it has a bug/feature in that NA is now == to FALSE.... But then you arent going to use that code.


Safer would be to define a new binary operator:

> assign("%=na%",function(a,b){a[is.na(a)]<-FALSE; b[is.na(b)]<-FALSE; get("==","package:base")(a,b)})

Then you can do:

> c(1,2,3,NA,NA,NA) %=na% c(1,NA,2,NA,NA,4)
[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

again this has the same NA==FALSE property.

Here's a truth table for that operator:

> outer(c(T,F,NA),c(T,F,NA),"%=na%")
      [,1]  [,2]  [,3]
[1,]  TRUE FALSE FALSE
[2,] FALSE  TRUE  TRUE
[3,] FALSE  TRUE  TRUE

You just need to write an operator that returns TRUE on the diagonal only.... Easy modification of %=na% but its late on a Friday and I have a poker game to attend...

Did I say not to use my code that redefines '=='? Well dont use it. Ever.

Baz

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to