sapply的并行版本

时间:2015-06-25 12:34:22

标签: r parallel-processing

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

如果这是一个重复的问题,请告诉我。

感谢。

3 个答案:

答案 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(....))