# [R] R function calling. Do I understand this right?

Friedrich Leisch Friedrich.Leisch at ci.tuwien.ac.at
Mon Aug 28 16:43:30 CEST 2000

```>>>>> On Mon, 28 Aug 2000 08:31:51 -0500,
>>>>> Paul E Johnson (PEJ) wrote:

PEJ> I need to write a nonhierarchical clustering routine and I'm studying
PEJ> the way hclust (in the mva library) is built in R to see how things are
PEJ> done and what I can modify. I ran f2c on the hclust.f file (so I could
PEJ> read it in a language I know!) and there is one thing I don't quite
PEJ> understand about the way it gets called and the way it returns values.
PEJ> That Fortran function gets called in hclust.R, like this:

PEJ> hclust <- function(d, method="complete")
PEJ> {
PEJ> 	<snip>
PEJ>     n <- attr(d, "Size")
PEJ>     if(is.null(n))
PEJ> 	stop("invalid dissimilarities")
PEJ>     labels <- attr(d, "Labels")

PEJ>     len <- n*(n-1)/2
PEJ>     hcl <- .Fortran("hclust",
PEJ> 		    n = as.integer(n),
PEJ> 		    len = as.integer(len),
PEJ> 		    method = as.integer(method),
PEJ> 		    ia = integer(n),
PEJ> 		    ib = integer(n),
PEJ> 		    crit = double(n),
PEJ> 		    membr = double(n),
PEJ> 		    nn = integer(n),
PEJ> 		    disnn = double(n),
PEJ> 		    flag = logical(n),
PEJ> 		    diss = as.double(d), PACKAGE="mva")
PEJ> 	<snip>

PEJ> In this call, the "actual data" input is an integer "n", an integer
PEJ> "len", an integer "method", and "diss", which is the vector obtained by
PEJ> coercing bottom left part of a dissimiliarty matrix into a vector of
PEJ> doubles.

PEJ> So, I believe that means d is like this

PEJ> x     x  x
PEJ> 1.1   x  x
PEJ> 3.3  4.4  x

PEJ> And diss is {1.1,3.3,4.4}

yes:

R> d <- dist(matrix(1:10,5))
R> d
1 2 3 4
2 1
3 2 1
4 3 2 1
5 4 3 2 1
R> as.double(d)
 1 2 3 4 1 2 3 1 2 1

PEJ> Now here is the qustion. All of the other variables listed as input,
PEJ> ia,ib, crit,membr,nn,disnn, and flag, are just empty vectors being
PEJ> passed through to be used inside the hclust function. Right?  And the
PEJ> changes made in those vectors inside the Fortran function are permanent,
PEJ> so the other functions in the hclust.R file can use those values?  (like
PEJ> passing in a pointer in C?)

well, yes and no: a call to .C or .Fortran returns a list with the
modified vectors (and the originals are not modified). only if you set
DUP=FALSE this duplication is not performed (but using this is not
recommended, see the help page of .C).

All these issues are explained in detail in the ``Writing R
Extensions'' manual which comes with the sources of R or can be

.f

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```