3

图书馆里有类似sapply的东西吗?multicore还是我必须这样做unlist(mclapply(..))才能实现这一目标?

如果它不存在:推理是什么?

提前致谢,如果这是一个愚蠢的问题,我们深表歉意!

4

3 回答 3

4

在 libraryparallel中,你有mcmapplywhich ,就像mapplyin一样base,需要一个SIMPLIFY参数。TRUE默认情况下。这是一个使用示例:

library(parallel)
mcmapply(sqrt,split(1:8,1:8))
#        1        2        3        4        5        6        7        8
# 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427

将此与mclapply.

mclapply(split(1:8,1:8),sqrt)
# $`1`
# [1] 1
# 
# $`2`
# [1] 1.414214
# ...
于 2013-02-23T18:33:28.717 回答
2

如果您查看sapply(及其辅助函数simplify2array)的代码,您会发现这unlist(obj)正是 obj 是所有length==1. sapply但是,它比仅取消列出列表要复杂得多。仍然非常不清楚的是您要解决的问题。

于 2013-02-23T18:33:18.947 回答
1

就像 IRTFM 提到的那样,查看 sapply 的源代码就是答案。但是由于我在阅读他的答案后仍然有点困惑,也许是我,所以如果你也是,那么希望遵循精确度会使它更清晰:sapply 的代码:

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
}

所以 mcsapply 的自制实现将是:

mcsapply<-function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE, mc.preschedule = TRUE,
 mc.set.seed = TRUE, mc.silent = FALSE, mc.cores = getOption("mc.cores", 2L), 
  mc.cleanup = TRUE, mc.allow.recursive = TRUE, affinity.list = NULL )
{
  answer <- mclapply(X = X, FUN = FUN, ...,mc.preschedule = mc.preschedule, 
mc.set.seed = mc.set.seed, mc.silent = mc.silent, mc.cores = mc.cores, 
  mc.cleanup = mc.cleanup, mc.allow.recursive = mc.allow.recursive, affinity.list = affinity.list)
  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
}

我正在使用类似的实现,它工作得很好。

于 2021-04-14T11:32:32.593 回答