正如@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。