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.