[Rd] Undefined behavior of head() and tail() with n = 0
Martin Maechler
maechler at stat.math.ethz.ch
Thu Jan 26 10:53:45 CET 2017
>>>>> Florent Angly <florent.angly at gmail.com>
>>>>> on Wed, 25 Jan 2017 16:31:45 +0100 writes:
> Hi all,
> The documentation for head() and tail() describes the behavior of
> these generic functions when n is strictly positive (n > 0) and
> strictly negative (n < 0). How these functions work when given a zero
> value is not defined.
> Both GNU command-line utilities head and tail behave differently with +0 and -0:
> http://man7.org/linux/man-pages/man1/head.1.html
> http://man7.org/linux/man-pages/man1/tail.1.html
> Since R supports signed zeros (1/+0 != 1/-0)
whoa, whoa, .. slow down -- The above is misleading!
Rather read in ?Arithmetic (*the* reference to consult for such issues),
where the 2nd part of the following section
|| Implementation limits:
||
|| [..............]
||
|| Another potential issue is signed zeroes: on IEC 60659 platforms
|| there are two zeroes with internal representations differing by
|| sign. Where possible R treats them as the same, but for example
|| direct output from C code often does not do so and may output
|| ‘-0.0’ (and on Windows whether it does so or not depends on the
|| version of Windows). One place in R where the difference might be
|| seen is in division by zero: ‘1/x’ is ‘Inf’ or ‘-Inf’ depending on
|| the sign of zero ‘x’. Another place is ‘identical(0, -0, num.eq =
|| FALSE)’.
says the *contrary* ( __Where possible R treats them as the same__ ):
We do _not_ want to distinguish -0 and +0,
but there are cases where it is inavoidable
And there are good reasons (mathematics !!) for this.
I'm pretty sure that it would be quite a mistake to start
differentiating it here... but of course we can continue
discussing here if you like.
Martin Maechler
ETH Zurich and R Core
> and the R head() and tail() functions are modeled after
> their GNU counterparts, I would expect the R functions to
> distinguish between +0 and -0
>> tail(1:5, n=0)
> integer(0)
>> tail(1:5, n=1)
> [1] 5
>> tail(1:5, n=2)
> [1] 4 5
>> tail(1:5, n=-2)
> [1] 3 4 5
>> tail(1:5, n=-1)
> [1] 2 3 4 5
>> tail(1:5, n=-0)
> integer(0) # expected 1:5
>> head(1:5, n=0)
> integer(0)
>> head(1:5, n=1)
> [1] 1
>> head(1:5, n=2)
> [1] 1 2
>> head(1:5, n=-2)
> [1] 1 2 3
>> head(1:5, n=-1)
> [1] 1 2 3 4
>> head(1:5, n=-0)
> integer(0) # expected 1:5
> For both head() and tail(), I expected 1:5 as output but got
> integer(0). I obtained similar results using a data.frame and a
> function as x argument.
> An easy fix would be to explicitly state in the documentation what n =
> 0 does, and that there is no practical difference between -0 and +0.
> However, in my eyes, the better approach would be implement support
> for -0 and document it. What do you think?
> Best,
> Florent
> PS/ My sessionInfo() gives:
> R version 3.3.2 (2016-10-31)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
> Running under: Windows 7 x64 (build 7601) Service Pack 1
> locale:
> [1] LC_COLLATE=German_Switzerland.1252
> LC_CTYPE=German_Switzerland.1252
> LC_MONETARY=German_Switzerland.1252 LC_NUMERIC=C
> LC_TIME=German_Switzerland.1252
> attached base packages:
> [1] stats graphics grDevices utils datasets methods base
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list