% File src/library/stats/man/dendrapply.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2015 R Core Team
% Distributed under GPL 2 or later

\name{dendrapply}
\alias{dendrapply}
\title{Apply a Function to All Nodes of a Dendrogram}
\description{
  Apply function \code{FUN} to each node of a \code{\link{dendrogram}}
  recursively.  When  \code{y <- dendrapply(x, fn)}, then \code{y} is a
  dendrogram of the same graph structure as \code{x} and for each node,
  \code{y.node[j] <- FUN( x.node[j], ...)} (where \code{y.node[j]} is an
  (invalid!) notation for the j-th node of y).
}
\usage{
dendrapply(X, FUN, ...)
}
\arguments{
  \item{X}{an object of class \code{"\link{dendrogram}"}.}
  \item{FUN}{an \R function to be applied to each dendrogram node,
    typically working on its \code{\link{attributes}} alone, returning an
    altered version of the same node.}
  \item{\dots}{potential further arguments passed to \code{FUN}.}
}
\value{
  Usually a dendrogram of the same (graph) structure as \code{X}.
  For that, the function must be conceptually of the form
  \code{FUN <- function(X) { attributes(X) <- .....;  X }},
  i.e., returning the node with some attributes added or changed.
}
\author{Martin Maechler}
\note{
  The implementation is somewhat experimental and suggestions for
  enhancements (or nice examples of usage) are very welcome.  The
  current implementation is \emph{recursive} and inefficient for
  dendrograms with many non-leaves.  See the \sQuote{Warning} in
  \code{\link{dendrogram}}.
}
\seealso{\code{\link{as.dendrogram}}, \code{\link{lapply}} for applying
  a function to each component of a \code{list}, \code{\link{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)
}
\keyword{iteration}
