Description Usage Arguments Details See Also Examples
%do%
and %dopar%
are binary operators that operate
on a foreach
object and an R
expression.
The expression, ex
, is evaluated multiple times in an environment
that is created by the foreach
object, and that environment is
modified for each evaluation as specified by the foreach
object.
%do%
evaluates the expression sequentially, while %dopar%
evalutes it in parallel.
The results of evaluating ex
are returned as a list by default,
but this can be modified by means of the .combine
argument.
1 2 3 4 5 6 7 8 9 10 11 |
... |
one or more arguments that control how |
.combine |
function that is used to process the tasks results as they generated. This can be specified as either a function or a non-empty character string naming the function. Specifying 'c' is useful for concatenating the results into a vector, for example. The values 'cbind' and 'rbind' can combine vectors into a matrix. The values '+' and '*' can be used to process numeric data. By default, the results are returned in a list. |
.init |
initial value to pass as the first argument of the
|
.final |
function of one argument that is called to return final result. |
.inorder |
logical flag indicating whether the |
.multicombine |
logical flag indicating whether the |
.maxcombine |
maximum number of arguments to pass to the combine function.
This is only relevant if |
.errorhandling |
specifies how a task evalution error should be handled.
If the value is "stop", then execution will be stopped via
the |
.packages |
character vector of packages that the tasks depend on.
If |
.export |
character vector of variables to export.
This can be useful when accessing a variable that isn't defined in the
current environment.
The default value in |
.noexport |
character vector of variables to exclude from exporting.
This can be useful to prevent variables from being exported that aren't
actually needed, perhaps because the symbol is used in a model formula.
The default value in |
.verbose |
logical flag enabling verbose messages. This can be very useful for trouble shooting. |
obj |
|
e1 |
|
e2 |
|
ex |
the |
cond |
condition to evaluate. |
n |
number of times to evaluate the |
The foreach
and %do%
/%dopar%
operators provide
a looping construct that can be viewed as a hybrid of the standard
for
loop and lapply
function.
It looks similar to the for
loop, and it evaluates an expression,
rather than a function (as in lapply
), but it's purpose is to
return a value (a list, by default), rather than to cause side-effects.
This faciliates parallelization, but looks more natural to people that
prefer for
loops to lapply
.
The %:%
operator is the nesting operator, used for creating
nested foreach loops. Type vignette("nested")
at the R prompt for
more details.
Parallel computation depends upon a parallel backend that must be
registered before performing the computation. The parallel backends available
will be system-specific, but include doParallel
, which uses R's built-in
parallel package, doMC, which uses the multicore package,
and doSNOW. Each parallel backend has a specific registration function,
such as registerDoParallel
or registerDoSNOW
.
The times
function is a simple convenience function that calls
foreach
. It is useful for evaluating an R
expression multiple
times when there are no varying arguments. This can be convenient for
resampling, for example.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # equivalent to rnorm(3)
times(3) %do% rnorm(1)
# equivalent to lapply(1:3, sqrt)
foreach(i=1:3) %do%
sqrt(i)
# equivalent to colMeans(m)
m <- matrix(rnorm(9), 3, 3)
foreach(i=1:ncol(m), .combine=c) %do%
mean(m[,i])
# normalize the rows of a matrix in parallel, with parenthesis used to
# force proper operator precedence
# Need to register a parallel backend before this example will run
# in parallel
foreach(i=1:nrow(m), .combine=rbind) %dopar%
(m[i,] / mean(m[i,]))
# simple (and inefficient) parallel matrix multiply
library(iterators)
a <- matrix(1:16, 4, 4)
b <- t(a)
foreach(b=iter(b, by='col'), .combine=cbind) %dopar%
(a %*% b)
# split a data frame by row, and put them back together again without
# changing anything
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d
identical(s, d)
# a quick sort function
qsort <- function(x) {
n <- length(x)
if (n == 0) {
x
} else {
p <- sample(n, 1)
smaller <- foreach(y=x[-p], .combine=c) %:% when(y <= x[p]) %do% y
larger <- foreach(y=x[-p], .combine=c) %:% when(y > x[p]) %do% y
c(qsort(smaller), x[p], qsort(larger))
}
}
qsort(runif(12))
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.