[Rd] RFC: is.whole() ? {"how to judge if a variable is an integer"}
Duncan Murdoch
murdoch.duncan at gmail.com
Tue Oct 28 11:48:07 CET 2014
On 28/10/2014, 5:32 AM, Martin Maechler wrote:
> Diverted to R-devel, as I'm requesting comments about a proposal
> to add is.whole() to R just so this issue does not trail on for
> centuries (;-), see below.
>
I didn't read the thread in question, but I think Bill's comment is
crucial: what properties of integers are you interested in testing?
One that comes up a lot is that some non-integral values print as
integers, and people get confused when using them as indices. For
example, this prints results that surprise some people:
x <- 1:10
index <- 4 - 1.e-10
index
x[index]
I would think is.whole(index) should return FALSE here, but the sfsmisc
function defaults to a nonzero tolerance, and returns TRUE.
Duncan Murdoch
>>>>>> William Dunlap <wdunlap at tibco.com>
>>>>>> on Sat, 18 Oct 2014 10:33:05 -0700 writes:
>
> > 3. all.equal(a, as.integer(a))
> > Note that this one tests if 'a' can be stored accurately as a 32-bit signed
> > integer. If you want to know if 'a' can be used as an accurate count, then
> > you want to test if a+1>a (use abs() in case a is negative). E.g., try this
> > for a<-2^49-1, about 5*10^14.
>
> > You have to decide what properties of integers you are interested in.
>
> > Bill Dunlap
> > TIBCO Software
> > wdunlap tibco.com
>
> good point, thank you, Bill.
>
> This whole issue comes up about once year (at least), it seems to me,
> and every time there are some good and some not so good propositions,
> some aiming for vectorized / whole object solutions some, only
> assuming scalar input.
>
> Indeed, I'd claim that all three proposals cited below are not
> good enough in one way or the other.... though one
> could argue that a "tolerance = 0" version would be good enough,
> and hence the
> function(x) x %% 1 == 0
> would be sufficient.
>
> In the CRAN package 'sfsmisc' (which I maintain), Alain Hauser
> recently added an
>
> is.whole()
>
> function which works "vectorized" and uses a 'tolerance' and
> then all.equal(), but in better way than (most / all ?) what was proposed in
> this thread (line 486 ff of
> https://github.com/mmaechler/sfsmisc/blob/master/R/misc-goodies.R ).
>
> Further, the CRAN packages
> 'gmp' ("infinite" precision integer and rational arithmetic) and
> 'Rmpfr' ('infinite' precision floating point arithmetic) contain
> an S3 generic is.whole() function and methods for their own
> number classes and a default method (( which "however" assumes
> a tolerance of zero, the same as the x %% 1 == 0 proposal)).
>
> Given all this, the r-help and stackoverflow threads,
> maybe we should decide that such an is.whole() function should
> be added to R and maintained (by me for the time), so we do have
> a better place to point people to, and well documented -- and
> eventually "optimized" -- behavior ?
>
> Personally I do think I'd want a "signature" of
> function (x, tolerance = sqrt(.Machine$double.eps))
>
>
> Martin
>
>
> > On Sat, Oct 18, 2014 at 10:02 AM, PO SU <rhelpmaillist at 163.com> wrote:
> >>
> >> Tks for your help, after investigate in your link, i find there seems three ways can be adoped:
> >> 1. is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol)
> >> e.g. is.wholenumber(1)
> >> 2. x%%1==0
> >>
> >>
> >> 3. all.equal(a, as.integer(a))
> >>
> >>
> >> and also included your last suggestion using floor. and also tks for other helpers！
> >> --
> >>
> >> PO SU
> >> mail: desolator88 at 163.com
> >> Majored in Statistics from SJTU
> >>
> >> At 2014-10-18 22:48:15, "Sergio Fonda" <sergio.fonda99 at gmail.com> wrote:
> >>
> >> Sorry for my previous hurry misunderstanding.
> >> Try this link:
> >> http://stackoverflow.com/questions/3476782/how-to-check-if-the-number-is-integer
> >>
> >> 2014-10-18 16:25 GMT+02:00 PO SU <rhelpmaillist at 163.com>:
> >>
> >> It's due to that, 1 is a numeric, 1.2 is a numeric, though it's true. but deeply, when i want to know 1 is an integer, there seems no easy way to get the answer.
> >>
> >> So, is there anyone happen to know it?
> >>
>
> >>
> >> At 2014-10-18 20:10:09, "S Ellison" <S.Ellison at LGCGroup.com> wrote:
> >>
> >>>> But i use a<-10/b , b is some value ,may be 5, maybe 5.5
> >>
> >>> If you do floating point arithmetic on integers you'll usually get floating point answers, including the 5.0.
> >>
> >>>
> >>
> >>> See FAQ 7.31 for the usual floating point problem, and ?all.equal for the usual answer to it. You could see if a result is close to an integer by,for example, using all.equal to compare it to itself after rounding.
> >>
> >>>
> >>
> >>> S
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
More information about the R-devel
mailing list