# [R] testing for integer

Douglas Bates bates at stat.wisc.edu
Sat Feb 24 23:03:41 CET 2001

```Faheem Mitha <faheem at email.unc.edu> writes:

> Consider the following fragment of R code
>
> choose <- function(n,r)
> {
>   if( is.integer(n) && is.integer(r) && n > 0 && r >= 0 )
>     {
>       .C("choose",as.double(n),as.double(r),comb = double(1))\$comb
>     }
>   else stop("n must be a positive integer and r a non-negative integer.")
> }
>
> This is a practice function (n choose r), which I wrote using a call to C
> code. Unfortunately, there is the following problem. I thought I would put
> in error checking for whether the arguments were integers. However,
> is.integer(1), for example, returns FALSE. However is.numeric(1) returns
> TRUE. It seems that explicit coercion is required for this ie.
> is.integer(as.integer(1)) returns true However, I can't use as.integer,
> because it is too aggressive for just error checking: it rounds off the
> value to the greatest integer less than. Can anyone suggest a suitable
> method of checking for an integer in this case?

Generally the S languages do not encourage distinguishing between
floating point and integer values at the level of S code.  The way the
values are stored should not be important to the user unless the user
is going to call C or Fortran code in which case you really do want to
use as.integer.  If you prefer not to get truncation then I would
suggest using as.integer(round(n)).

A more common way of writing the function would be

n <- as.numeric(n)[1]
r <- as.numeric(r)[1]
if( n <= 0 || r < 0 ) stop("n must be positive and r non-negative")
.C("choose", as.integer(round(n)), as.integer(round(r)), comb = double(1))\$comb

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```