我喜欢 R 中的包,喜欢并行版本的,等parallel
是多么容易和直观。apply
sapply
是否有类似的并行功能replicate
?
您可以只使用lapply
or的并行版本,而不是说在执行应用时sapply
复制此表达式,而不是给出表达式,而是将该表达式包装在一个忽略发送给它的参数的函数中。n
1:n
可能是这样的:
#create cluster
library(parallel)
cl <- makeCluster(detectCores()-1)
# get library support needed to run the code
clusterEvalQ(cl,library(MASS))
# put objects in place that might be needed for the code
myData <- data.frame(x=1:10, y=rnorm(10))
clusterExport(cl,c("myData"))
# Set a different seed on each member of the cluster (just in case)
clusterSetRNGStream(cl)
#... then parallel replicate...
parSapply(cl, 1:10000, function(i,...) { x <- rnorm(10); mean(x)/sd(x) } )
#stop the cluster
stopCluster(cl)
作为并行等价物:
replicate(10000, {x <- rnorm(10); mean(x)/sd(x) } )
使用clusterEvalQ
作为模型,我想我会实现一个并行replicate
:
parReplicate <- function(cl, n, expr, simplify=TRUE, USE.NAMES=TRUE)
parSapply(cl, integer(n), function(i, ex) eval(ex, envir=.GlobalEnv),
substitute(expr), simplify=simplify, USE.NAMES=USE.NAMES)
这些论点simplify
和与而不是USE.NAMES
兼容,但在我看来,它们使它成为更好的包装。sapply
replicate
parSapply
replicate
这是从手册页派生的示例:
library(parallel)
cl <- makePSOCKcluster(3)
hist(parReplicate(cl, 100, mean(rexp(10))))
future.apply包提供了一个插件替代并行运行,并使用开箱即用的统计声音并行随机数生成:replicate()
library(future.apply)
plan(multisession, workers = 4)
y <- future_replicate(100, mean(rexp(10)))