6

Rのレプリケート関数からの出力について混乱しています.2つの異なる方法で使用しようとしています.(私の考えでは)行列を出力として与える必要があります.

だから、私が使用する場合

replicate(5, seq(1,5,1))

マトリックス5x5を取得します

    [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

..そして、それは大丈夫です、私はそれを理解しています...

しかし、代わりに使用すると:

replicate(5, for(i in 1:5){print(i)})

私は以下を取得します:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

なぜこれが起こるのか誰かが私に説明できますか? ありがとう :)

4

3 に答える 3

5

forループが戻りますNULL。2 番目のケースでは、replicate関数がfor(i in 1:5){print(i)}5 回実行されているため、これらすべての数値が表示されます。

次に、戻り値をリストに入れているため、replicate呼び出しの戻り値は 5 つNULLのリストであり、出力されます。実行中

x<-replicate(5, for(i in 1:5){print(i)})
x

明確にする必要があります。

于 2013-10-31T21:38:50.367 に答える
4

@mripが言うように、forループはNULLを返すため、ループ内のオブジェクトに割り当て、そのオブジェクトを返してreplicate出力できるようにする必要があります。ただし、mrip のコードでは、replicate評価の反復ごとに NULL が返されます。

また、出力を名前に割り当てる必要があるreplicateため、単に蒸発したり、ガベージ コレクションを取得したりしません。つまり、d中かっこ内の式全体の評価が NULL ではなく「何か」を返すように、別のステートメントとして追加する必要があります。

d <- numeric(5); res <- replicate(5, { 
                            for(i in 1:5){d[i] <- print(i)} ; d}
                                  )
[1] 1
[1] 2

snipped
[1] 4
[1] 5
> res
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5
于 2013-10-31T22:43:56.677 に答える
0

for ループはリストを返しますが、seq()呼び出しはベクトルを返します。seq()これにより、for ループを使用した場合と同じ結果が得られるはずです。

foo <- function(){
  b = list()
  for(i in 1:5) b[i] <- i
  do.call(c, b)
}

replicate(5, foo())
于 2013-10-31T21:39:18.723 に答える