R: Apply a Function to All Nodes of a Dendrogram

dendrapply {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

The implementation is somewhat experimental and suggestions for enhancements (or nice examples of usage) are very welcome. The current implementation is recursive and inefficient for dendrograms with many non-leaves. See the ‘Warning’ in `dendrogram`.

### 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)

[Package stats version 3.5.1 Index]