## not necessarily reproducible examples.

library(parallel)


cl <- makeCluster(getOption("cl.cores", 2))

clusterApply(cl, 1:2, get("+"), 3)
xx <- 1
clusterExport(cl, "xx")
clusterCall(cl, function(y) xx + y, 2)

## Use clusterMap like an mapply example
clusterMap(cl, function(x,y) seq_len(x) + y,
          c(a =  1, b = 2, c = 3), c(A = 10, B = 0, C = -10))


parSapply(cl, 1:20, get("+"), 3)

## PR14898
parSapply(cl, 1, identity)

if(require(boot)) {
    set.seed(11)
    ## A bootstrapping example, which can be done in many ways:
    clusterEvalQ(cl, {
        ## set up each worker.  Could also use clusterExport()
        library(boot)
        cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
        cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
        NULL
    })
    res <- clusterEvalQ(cl, boot(cd4, corr, R = 100,
                                 sim = "parametric", ran.gen = cd4.rg, mle = cd4.mle))
    cd4.boot <- do.call(c, res)
    print(boot.ci(cd4.boot,  type = c("norm", "basic", "perc"),
                  conf = 0.9, h = atanh, hinv = tanh))
}
stopCluster(cl)


