is.na(v)<-b (was: Re: [R] Beginner's query - segmentation fault)

Uwe Ligges ligges at statistik.uni-dortmund.de
Wed Oct 8 10:28:13 CEST 2003


Richard A. O'Keefe wrote:

> I am puzzled by the advice to use is.na(x) <- TRUE instead of x <- NA.
> 
> ?NA says
>      Function `is.na<-' may provide a safer way to set missingness. It
>      behaves differently for factors, for example.
> 
> However, "MAY provide" is a bit scary, and it doesn't say WHAT the
> difference in behaviour is.
> 
> I must say that "is.na(x) <- ..." is rather repugnant, because it doesn't
> work.  What do I mean?  Well, as the designers of SETL who many years ago
> coined the term "sinister function call" to talk about f(...)<-...,
> pointed out, if you do
>     f(x) <- y
> then afterwards you expect
>     f(x) == y
> to be true.  So let's try it:
> 
>     > x <- c(1,NA,3)
>     > is.na(x) <- c(FALSE,FALSE,TRUE)
>     > x
>     [1]  1 NA NA
>     > is.na(x)
>     [1] FALSE  TRUE  TRUE
>                         vvvvv
> So I _assigned_ c(FALSE,FALSE,TRUE) to is.na(x),
>     but I _got_ c(FALSE,TRUE, TRUE)> instead.
>                         ^^^^^
> That is not how a well behaved sinister function call should work,
> and it's enough to scare someone off is.na()<- forever.
> 
> The obvious way to set elements of a variable to missing is ... <- NA.
> Wouldn't it be better if that just plain worked?
> 
> Can someone give an example of is.na()<- and <-NA working differently
> with a factor?  I just tried it:
> 
>     > x <- factor(c(3,1,4,1,5,9))
>     > y <- x
>     > is.na(x) <- x==1
>     > y[y==1] <- NA
>     > x
>     [1] 3    <NA> 4    <NA> 5    9   
>     Levels: 1 3 4 5 9
>     > y
>     [1] 3    <NA> 4    <NA> 5    9   
>     Levels: 1 3 4 5 9
> 
> Both approaches seem to have given the same answer.  What did I miss?


As mentioned in another mail to R-help. I'm pretty sure there was (is?) 
a problem with character (and/or factor) and assignment of NAs, but I 
cannot (re)produce an example. I think something for the "x <- NA" case 
has been fixed during the last year.
What prevents me to think I'm completely confused is that the is.na()<- 
usage is proposed in: ?NA, S Programming, the R Language Definition 
manual, R's News file, but I cannot find it in the green book right now.

Uwe Ligges




More information about the R-help mailing list