图书馆里有类似sapply
的东西吗?multicore
还是我必须这样做unlist(mclapply(..))
才能实现这一目标?
如果它不存在:推理是什么?
提前致谢,如果这是一个愚蠢的问题,我们深表歉意!
在 libraryparallel
中,你有mcmapply
which ,就像mapply
in一样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
# ...
如果您查看sapply
(及其辅助函数simplify2array
)的代码,您会发现这unlist(obj)
正是 obj 是所有length==1
. sapply
但是,它比仅取消列出列表要复杂得多。仍然非常不清楚的是您要解决的问题。
就像 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
}
我正在使用类似的实现,它工作得很好。