sapply的并行版本

Anu*_*nuj 7 parallel-processing r

我们是否有并行版本的 sapply,因为我们在并行包中有 mclapply,它是 lapply 的一个版本。

gve*_*yon 7

正如@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>
Run Code Online (Sandbox Code Playgroud)

reprex 包(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 ...
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2019 年 11 月 22 日创建

最后,您始终可以创建一个 Fork 集群并使用parSapply


RHe*_*tel 0

snow 软件包提供并行版本apply()和相关功能。