3

図書館に何かsapplyありますか?multicoreそれともunlist(mclapply(..))、これを達成するために私はしなければなりませんか?

それが存在しない場合:理由は何でしょうか?

よろしくお願いします。これがばかげた質問である場合は申し訳ありません。

4

3 に答える 3

4

ライブラリparallelにはmcmapply、のようmapplyに引数baseを取るものがあります。デフォルトですSIMPLIFYTRUE使用例を次に示します。

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==1sapplyただし、リストをリストから外すよりもはるかに複雑です。まだ非常に不明確なのは、解決しようとしている問題です。

于 2013-02-23T18:33:18.947 に答える
1

IRTFMが述べたように、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 に答える