blob: 51d2272b8130e993d1129bbfe38b14c2fbab7c26 [file] [log] [blame]
% 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}