10

次のようなカスタム関数を定義しました。

my.fun = function() {

      for (i in 1:1000) {
      ...
        for (j in 1:20) {
          ...
        }
      }

 return(output)

}

outputこれは、 1000 行 20 列で構成される出力行列 を返します。

私がする必要があるのは、関数を 5 回繰り返して、5 つの結果をまったく新しい行列に格納することoutputです。これらの追加の 5 回の繰り返しを並列化しようとします)。final

したがってfinal、5000 行 20 列の行列である必要があります (これらの 5 回の繰り返しの背後にある理論的根拠は、他の関数の中でも特に使用する 2 つの for ループ内にありますsample)。

5 つの複製を正しく計算するを使用しようとしましfinal <- replicate(5, my.fun())たが、要素を新しい 5000 x 20 マトリックスに「手動で」配置する必要があります。これを行うよりエレガントな方法はありますか? (おそらく使用してsapply()いますか?)。どうもありがとう

4

4 に答える 4

14

現状では、おそらく3次元の配列があります。リストが必要な場合は、simplify=FALSE を追加します。これを試して:

do.call( rbind, replicate(5, my.fun(), simplify=FALSE ) )

apermまたは、「最終」がまだ配列である場合に使用できます。

fun <- function() matrix(1:10, 2,5)
final <- replicate( 2, fun() )
> final
, , 1

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

, , 2

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

> t( matrix(aperm(final, c(2,1,3)), 5,4) )
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
[3,]    1    3    5    7    9
[4,]    2    4    6    8   10

より経済的な行列操作があるかもしれません。まだ発見していないだけです。

于 2013-01-23T22:09:09.023 に答える
7

パッケージのrlplyに置き換えるreplicateと、次のように使用できます。plyrdo.callrbind

library(plyr)
do.call(rbind, rlply(5, my.fun()))

plyrパッケージに依存したくない場合は、いつでも次のことができます。

do.call(rbind, lapply(1:5, function(i) my.fun()))
于 2013-01-23T22:03:38.197 に答える
7

並列計算に使用するパッケージによって異なりますが、これを行う方法は次のとおりです ( を使用して、ループ内で非表示にします のsapplyようにreplicate)。

library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
# sfExport() #export appropriate objects that will be needed inside a function, if applicable
# sfLibrary() #call to any special library
out <- sfSapply(1:5, fun = my.fun, simplify = FALSE)
sfStop()
于 2013-01-23T22:52:04.910 に答える
0

これを試して:

final <- replicate(5, my.fun(), simplify = "matrix")

「最終」の結果を行列の形で取得します。

于 2015-05-10T05:42:49.557 に答える