[R] vectorizing a function

Robin Hankin r.hankin at auckland.ac.nz
Wed Oct 23 03:32:00 CEST 2002

Dear R-xperts

I have just written a little hypergeometric function, included below
[the hypergeometric function crops up when solving a common type of

It works fine on single values of the primary argument z, but
vectorizing it is getting confusing.

The best I have come up with so far just tests for z being longer than
1 and if so, uses sapply() recursively.  This is fine, except that it
doesn't preserve the dimensions correctly if z is a matrix or an
array.  And the function doesn't work properly if z is a scalar but A
is a vector.

besselI() does The Right Thing (tm), but it is internal ; what is the
best way to vectorize this type of function?

hypergeo <- function(A,B,C,z,tol=1e-6){
  if(length(z) > 1) {
  } else { 
    term <- tmp <- 1
    for(n in 1:100){
      term <- term*A*B/C
      partial.sum <- tmp + term
      if ((abs(partial.sum-tmp)<tol) || is.infinite(partial.sum)){return(partial.sum)}
      A <- A+1
      B <- B+1
      C <- C+1
      tmp <- partial.sum
    return (NaN)


Robin Hankin, Lecturer,
School of Geography and Environmental Science
Tamaki Campus
Private Bag 92019 Auckland
New Zealand

r.hankin at auckland.ac.nz
tel 0064-9-373-7599 x6820; FAX 0064-9-373-7042

as of: Wed Oct 23 14:25:00 NZDT 2002
This (linux) system up continuously for:  419 days, 20 hours, 07 minutes
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