[Rd] table(exclude = NULL) always includes NA

Martin Maechler
Mon, 15 Aug 2016 10:35:41 -0000

>>>>> Martin Maechler <maechler at stat.math.ethz.ch>
>>>>>     on Mon, 15 Aug 2016 11:07:43 +0200 writes:

>>>>> Suharto Anggono Suharto Anggono <suharto_anggono at
yahoo.com>
>>>>>     on Sun, 14 Aug 2016 03:42:08 +0000 writes:

    >> useNA <- if (missing(useNA) && !missing(exclude)
&& !(NA %in% exclude)) "ifany"
    >> An example where it change 'table' result for non-factor
input, from https://stat.ethz.ch/pipermail/r-help/2005-April/069053.html :

    >> x <- c(1,2,3,3,NA)
    >> table(as.integer(x), exclude=NaN)

    >> I bring the example up, in case that the change in result is not
intended.

    > Thanks a lot, Suharto.

    > To me, the example is convincing that the change (I commited
    > Friday), svn rev 71087 & 71088,   are a clear improvement:

    > (As you surely know, but not all the other readers:)
    > Before the change, the above example gave *different* results
    > for  'x'  and  'as.integer(x)', the integer case *not*
counting the NAs,
    > whereas with the change in effect, they are the same:

    >> x <- as.integer(dx <- c(1,2,3,3,NA))
    >> table(x, exclude=NaN); table(dx, exclude=NaN)
    > x
    > 1    2    3 <NA>
    > 1    1    2    1
    > dx
    > 1    2    3 <NA>
    > 1    1    2    1
    >>

    > --
    > But the change has affected 6-8 (of the 8000+) CRAN packages
    > which I am investigating now and probably will be in contact with the
    > package maintainers after that.

There has been another bug in table(), since the time  'useNA'
was introduced, which gives (in released R, R-patched, or R-devel):

  > table(1:3, exclude = 1, useNA = "ifany")

     2    3 <NA>
     1    1    1
  >

and that bug now (in R-devel, after my changes) triggers in
cases it did not previously, notably in

    table(1:3, exclude = 1)

which now does set 'useNA = "ifany"' and so gives the same
silly
result as the one above.

The reason for this bug is that   addNA(..)  is called (in all R
versions mentioned) in this case, but it should not.

I'm currently testing yet another amendment..

Martin