\Header{controlledApply}{controlledApply}
\keyword{iteration}{controlledApply}
\begin{Description}\relax
Same functionality as \code{\Link{simpleApply}} but
possibly faster. In certain circumstances the function
\code{apply} is used instead of \code{\Link{simpleApply}}
which improves the performace.
\end{Description}
\begin{Usage}
\begin{verbatim}controlledApply(arrayObject, dimensions, func, funcResultDimensionality)\end{verbatim}
\end{Usage}
\begin{Arguments}
\begin{ldescription}
\item[\code{arrayObject}] object of class \code{array}
\item[\code{dimensions}] increasing numeric vector
\item[\code{func}] unary function
\item[\code{funcResultDimensionality}] numeric (vector) specifying
the dimensionality of the return value of \code{func}
\end{ldescription}
\end{Arguments}
\begin{Value}
An array of
\code{dim=c(dim(arrayObject[dimensions]),funcResultDimensionality)}.
You may want to use \code{\Link{aperm}} to rearrange the dimensions.
\end{Value}
\begin{Author}\relax
Andreas Buness <a.buness@dkfz.de>
\end{Author}
\begin{Examples}
\begin{ExampleCode}

a <- array(c(1:30),dim=c(3,2,5))
r <- controlledApply(a, 1, function(x){return(x[2,5])}, 1)
stopifnot( all(r == matrix(data=c(28:30))))

r <- controlledApply(a, 2, function(x){return(x[,])}, c(3,5))
stopifnot( all( a == aperm(r,c(2,1,3)) ) )

vec <- 1:10; dim(vec) <- c(10,1)
mat <- matrix(data=rep(1:10,4),nrow=10,ncol=4,byrow=FALSE)
r <- controlledApply(mat,1,function(y){return(mean(y))},1)
stopifnot(all(r==vec))

r <- controlledApply(mat, 1:2, function(x) return(x), 1)
stopifnot( all(r[,,1] == mat) )

r <- controlledApply(a, c(1,3) , function(x) return(x), dim(a)[2])
stopifnot( all(aperm(r[,,],c(1,3,2)) == a) )

r <- controlledApply(a, 1:2, function(x) return(x[2]), 1)
stopifnot( all(r[,,] == a[,,2]) )

r <- controlledApply(a, 1, function(x) return(x), c(dim(a)[2],dim(a)[3]))
stopifnot( all( r== a ) )

 

 \end{ExampleCode}
\end{Examples}

