各反復で上書きw
しているため、最終的には最後の反復での値のみになりw
ます。
デッキをシャッフルする回数がわかっている場合は、for
ループよりもループを使用する方がよいでしょうrepeat
。
w
との実際の比較を含めるのか、それとも一致しないものがあったかどうかを示すsとsのdeck
ベクトルだけを含めるのかは明確ではありません。とにかく、これらの両方を実装するいくつかの例を次に示します。0
1
shuffle <- function(deck, n) {
out <- logical(length = n)
shuf <- deck
for(i in seq_len(n)) {
shuf <- sample(shuf)
out[i] <- any(shuf == deck)
}
out <- as.numeric(out)
out
}
これは次のように使用され、次のように生成されます。
> set.seed(42)
> deck <- 1:100
> (out <- shuffle(deck, 20))
[1] 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1
deck
とシャッフルされたデッキの間の一致の位置を返すバージョンは次のとおりです。
shuffle2 <- function(deck, n) {
out <- matrix(NA, ncol = n, nrow = length(deck))
shuf <- deck
for(i in seq_len(n)) {
shuf <- sample(shuf)
out[,i] <- shuf == deck
}
out <- out + 0
out
}
これは次のように使用され、
> set.seed(42)
> deck <- 1:100
> (out2 <- shuffle2(deck, 20))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 0 0 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 0 0
[9,] 0 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 1 0 0 0 0 0 0 0
....
その一致の行列は簡単に処理され、一致するかどうかのベクトルが生成されます。
> as.numeric(apply(out2 > 0, 2, any))
[1] 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1
これは。によって与えられたものと一致しshuffle()
ます。
もちろん、2つを組み合わせて、関数によって両方を返すこともできます。
shuffle3 <- function(deck, n) {
out <- matrix(NA, ncol = n, nrow = length(deck))
shuf <- deck
for(i in seq_len(n)) {
shuf <- sample(shuf)
out[,i] <- shuf == deck
}
out <- list(matches = out+0,
summary = as.numeric(apply(out > 0, 2, any)))
out
}
これは、次のように使用され、生成されます。
> set.seed(42)
> deck <- 1:100
> out3 <- shuffle3(deck, 20)
> str(out3)
List of 2
$ matches: num [1:100, 1:20] 0 0 0 0 0 0 0 0 0 0 ...
$ summary: num [1:20] 0 1 1 1 1 0 1 0 0 1 ...
> out3$summary
[1] 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1
どちらのバージョンを使用する場合でも、最初に必要なサイズの結果を保持するオブジェクトを作成してから、ループを進めながらそのオブジェクトを入力することに注意してください。