[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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list