testing for integer
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._