# [R] FW: NaN from function

Petr Savicky savicky at cs.cas.cz
Thu Feb 23 17:57:27 CET 2012

On Thu, Feb 23, 2012 at 04:40:07PM -0000, Ted Harding wrote:
[...]
> A basic solution for this special case would be
>
>   zt=function(x){
>     if (sd(x) == 0) return(0*x) else return( (x-mean(x))/sd(x) )
>   }
>
>
>
>   if (length(table(x)>1))
>   if (length(table(x)==1))
>
> since they ask for "length(table(x)>1)", which doesn't seem
> to represent any natural criterion. E.g.:
>
>   length(table(1:10)>1)
>   # [1] 10
>   length(table(rep(1,10))>1)
>   # [1] 1
>
>   if(length(table(1:10)>1)) y <- "Yes" else y <- "No" ; y
>   # [1] "Yes"
>   if(length(table(rep(1,10))>1)) y <- "Yes" else y <- "No" ; y
>   # [1] "Yes"
>
>   length(table(1:10)==1)
>   # [1] 10
>   length(table(rep(1,10))==1)
>   # [1] 1
>
>   if(length(table(1:10)==1)) y <- "Yes" else y <- "No" ; y
>   # [1] "Yes"
>   if(length(table(rep(1,10))==1)) y <- "Yes" else y <- "No" ; y
>   # [1] "Yes"
>
> I suspect you meant to write
>
>   if (length(table(x))>1)
> and
>   if (length(table(x)))==1)
>
> since this distinguishes between two more more different values
> (length(table(x)) > 1) and all equal values (length(table(x)) == 1).

Hi.

The condition length(table(x)) > 1 may also be written as
lentgh(unique(x)) > 1. These two conditions are usually
equivalent, but not always due to the rounding to 15 digits
performed in table(). For example

x <- 1 + (0:10)*2^-52
length(table(x))  # [1] 1
length(unique(x)) # [1] 11
sd(x)             # [1] 7.364386e-16
diff(x)           # [1] 2.220446e-16 2.220446e-16 2.220446e-16 ...

Petr Savicky.