2025-01-12 04:36:52 +08:00

174 lines
5.2 KiB
R

## ----loadLibs-----------------------------------------------------------------
library(foreach)
## ----ex1----------------------------------------------------------------------
x <- foreach(i=1:3) %do% sqrt(i)
x
## ----ex2----------------------------------------------------------------------
x <- foreach(a=1:3, b=rep(10, 3)) %do% (a + b)
x
## ----ex3----------------------------------------------------------------------
x <- foreach(a=1:3, b=rep(10, 3)) %do% {
a + b
}
x
## ----ex4----------------------------------------------------------------------
x <- foreach(a=1:1000, b=rep(10, 2)) %do% {
a + b
}
x
## ----ex5----------------------------------------------------------------------
x <- foreach(i=1:3, .combine='c') %do% exp(i)
x
## ----ex6----------------------------------------------------------------------
x <- foreach(i=1:4, .combine='cbind') %do% rnorm(4)
x
## ----ex7----------------------------------------------------------------------
x <- foreach(i=1:4, .combine='+') %do% rnorm(4)
x
## ----ex7.1--------------------------------------------------------------------
cfun <- function(a, b) NULL
x <- foreach(i=1:4, .combine='cfun') %do% rnorm(4)
x
## ----ex7.2--------------------------------------------------------------------
cfun <- function(...) NULL
x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE) %do% rnorm(4)
x
## ----ex7.3--------------------------------------------------------------------
cfun <- function(...) NULL
x <- foreach(i=1:4, .combine='cfun', .multicombine=TRUE, .maxcombine=10) %do% rnorm(4)
x
## ----ex7.4--------------------------------------------------------------------
foreach(i=4:1, .combine='c') %dopar% {
Sys.sleep(3 * i)
i
}
foreach(i=4:1, .combine='c', .inorder=FALSE) %dopar% {
Sys.sleep(3 * i)
i
}
## ----ex8----------------------------------------------------------------------
library(iterators)
x <- foreach(a=irnorm(4, count=4), .combine='cbind') %do% a
x
## ----ex9----------------------------------------------------------------------
set.seed(123)
x <- foreach(a=irnorm(4, count=1000), .combine='+') %do% a
x
## ----ex10---------------------------------------------------------------------
set.seed(123)
x <- numeric(4)
i <- 0
while (i < 1000) {
x <- x + rnorm(4)
i <- i + 1
}
x
## ----ex11---------------------------------------------------------------------
set.seed(123)
x <- foreach(icount(1000), .combine='+') %do% rnorm(4)
x
## ----ex12.data----------------------------------------------------------------
x <- matrix(runif(500), 100)
y <- gl(2, 50)
## ----ex12.load----------------------------------------------------------------
library(randomForest)
## ----ex12.seq-----------------------------------------------------------------
rf <- foreach(ntree=rep(250, 4), .combine=combine) %do%
randomForest(x, y, ntree=ntree)
rf
## ----ex12.par-----------------------------------------------------------------
rf <- foreach(ntree=rep(250, 4), .combine=combine, .packages='randomForest') %dopar%
randomForest(x, y, ntree=ntree)
rf
## ----ex13.orig----------------------------------------------------------------
applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) {
ans <- vector("list", d2)
for(i in 1:d2) {
tmp <- FUN(array(newX[,i], d.call, dn.call), ...)
if(!is.null(tmp)) ans[[i]] <- tmp
}
ans
}
applyKernel(matrix(1:16, 4), mean, 4, 4)
## ----ex13.first---------------------------------------------------------------
applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) {
foreach(i=1:d2) %dopar%
FUN(array(newX[,i], d.call, dn.call), ...)
}
applyKernel(matrix(1:16, 4), mean, 4, 4)
## ----ex13.second--------------------------------------------------------------
applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) {
foreach(x=iter(newX, by='col')) %dopar%
FUN(array(x, d.call, dn.call), ...)
}
applyKernel(matrix(1:16, 4), mean, 4, 4)
## ----ex13.iter, results="hide"------------------------------------------------
iblkcol <- function(a, chunks) {
n <- ncol(a)
i <- 1
nextElem <- function() {
if (chunks <= 0 || n <= 0) stop('StopIteration')
m <- ceiling(n / chunks)
r <- seq(i, length=m)
i <<- i + m
n <<- n - m
chunks <<- chunks - 1
a[,r, drop=FALSE]
}
structure(list(nextElem=nextElem), class=c('iblkcol', 'iter'))
}
nextElem.iblkcol <- function(obj) obj$nextElem()
## ----ex13.third---------------------------------------------------------------
applyKernel <- function(newX, FUN, d2, d.call, dn.call=NULL, ...) {
foreach(x=iblkcol(newX, 3), .combine='c', .packages='foreach') %dopar% {
foreach(i=1:ncol(x)) %do% FUN(array(x[,i], d.call, dn.call), ...)
}
}
applyKernel(matrix(1:16, 4), mean, 4, 4)
## ----when---------------------------------------------------------------------
x <- foreach(a=irnorm(1, count=10), .combine='c') %:% when(a >= 0) %do% sqrt(a)
x
## ----qsort--------------------------------------------------------------------
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))