我们是否有sapply的并行版本,因为我们在并行包中有mclapply,这是lapply的一个版本。
如果这是一个重复的问题,请告诉我。
感谢。
答案 0 :(得分:0)
snow
package提供apply()
及相关功能的并行版本。
答案 1 :(得分:0)
正如@RHertel指出的那样,snow
程序包具有适用的族选项,但并不要求使用mcsapply
函数。如果您看一下sapply
的实现,它只是对lapply
的调用,还有更多的后期处理:
sapply
#> function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
#> {
#> FUN <- match.fun(FUN)
#> answer <- lapply(X = X, FUN = FUN, ...)
#> if (USE.NAMES && is.character(X) && is.null(names(answer)))
#> names(answer) <- X
#> if (!isFALSE(simplify) && length(answer))
#> simplify2array(answer, higher = (simplify == "array"))
#> else answer
#> }
#> <bytecode: 0x559a53feef18>
#> <environment: namespace:base>
由reprex package(v0.3.0)于2019-11-22创建
由于mclapply
功能等效于lapply
,因此您实际上可以编写自己的内容来替换sapply
的某些部分,下面是一个示例:
# An mc-version of the sapply function.
mcsapply <- function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) {
FUN <- match.fun(FUN)
answer <- parallel::mclapply(X = X, FUN = FUN, ...)
if (USE.NAMES && is.character(X) && is.null(names(answer)))
names(answer) <- X
if (!isFALSE(simplify) && length(answer))
simplify2array(answer, higher = (simplify == "array"))
else answer
}
# Testing it out
library(parallel)
ans0 <- mcsapply(1:20, function(i) rnorm(1e4), mc.cores = 4)
ans1 <- sapply(1:20, function(i) rnorm(1e4))
# Same structure
str(ans0)
#> num [1:10000, 1:20] 0.1792 0.1581 -0.1293 -0.0324 0.1836 ...
str(ans1)
#> num [1:10000, 1:20] 1.304 1.355 -1.387 1.07 0.582 ...
由reprex package(v0.3.0)于2019-11-22创建
最后,您始终可以创建一个Fork集群,并改用parSapply
。
答案 2 :(得分:-1)
如果您的输出可能被强制转换为原子向量,则可以使用unlist(mclapply(....))
。