dendrapply               package:stats               R Documentation

Apply a Function to All Nodes of a Dendrogram

Description:

     Apply function 'FUN' to each node of a 'dendrogram' recursively. 
     When  'y <- dendrapply(x, fn)', then 'y' is a dendrogram of the
     same graph structure as 'x' and for each node, 'y.node[j] <- FUN(
     x.node[j], ...)' (where 'y.node[j]' is an (invalid!) notation for
     the j-th node of y.

Usage:

     dendrapply(X, FUN, ...)

Arguments:

       X: an object of class '"dendrogram"'.

     FUN: an R function to be applied to each dendrogram node,
          typically working on its 'attributes' alone, returning an
          altered version of the same node.

     ...: potential further arguments passed to 'FUN'.

Value:

     Usually a dendrogram of the same (graph) structure as 'X'. For
     that, the function must be conceptually of the form 'FUN <-
     function(X) { attributes(X) <- .....;  X }', i.e. returning the
     node with some attributes added or changed.

Note:

     this is still somewhat experimental, and suggestions for
     enhancements (or nice examples of usage) are very welcome.

Author(s):

     Martin Maechler

See Also:

     'as.dendrogram', 'lapply' for applying a function to each
     component of a 'list', 'rapply' for doing so to each non-list
     component of a nested list.

Examples:

     require(graphics)

     ## a smallish simple dendrogram
     dhc <- as.dendrogram(hc <- hclust(dist(USArrests), "ave"))
     (dhc21 <- dhc[[2]][[1]])

     ## too simple:
     dendrapply(dhc21, function(n) utils::str(attributes(n)))

     ## toy example to set colored leaf labels :
     local({
       colLab <<- function(n) {
           if(is.leaf(n)) {
             a <- attributes(n)
             i <<- i+1
             attr(n, "nodePar") <-
                 c(a$nodePar, list(lab.col = mycols[i], lab.font= i%%3))
           }
           n
       }
       mycols <- grDevices::rainbow(attr(dhc21,"members"))
       i <- 0
      })
     dL <- dendrapply(dhc21, colLab)
     op <- par(mfrow=2:1)
      plot(dhc21)
      plot(dL) ## --> colored labels!
     par(op)

