2016-07-16 3 views
0

У меня есть данные, что выглядит следующим образом:цикл для выборки из другого списка на основе условия

List_of_lists = list("0" = list(4,6), "1" = list(6,8), "2" = list(7,9), 
        "3" = list(4,8), "4" = list(3,9,0), "6" = list(1,7,0), 
        "7" = list(2,6), "8" = list(1,3), "9" = list(2,4)) 

я хотел бы написать итеративную функцию, что первые образцы из первого индекса List_of_Moves (т.е. " 0 "), а для последующих итераций - выбор из другого списка, имя которого совпадает с результатом предыдущей итерации. Другими словами, если результат первой итерации равен 4, я выбираю из списка с именем «4» и т. Д. И т. Д.

В "Hack-н-Slash" R форме, это выглядит примерно так:

> sample(unlist(List_of_lists"0",1,replace=TRUE) 
4 
> sample(unlist(List_of_lists"4",1,replace=TRUE) 
3 
> sample(unlist(List_of_lists"3",1,replace=TRUE) 
8 
> sample(unlist(List_of_lists"8",1,replace=TRUE) 
1 
> sample(unlist(List_of_lists"1",1,replace=TRUE) 
6 

ответ

3

Возможно, что-то вроде этого. Мы образец элемента из List_of_lists, хранить его в качестве результата и передать его в качестве исходного параметра в следующий раунд и в то же время уменьшить их размер 1, пока мы не встретимся с size критериальные где мы возвращаемся NULL и итерация останавливается:

r_ge <- function(init = "0", size) { 
    if(size == 0) NULL 
    else { 
     tmp <- sample(List_of_lists[[as.character(init)]], 1) 
     c(unlist(tmp), r_ge(tmp, size - 1)) 
    } 
} 

Прецеденты:

r_ge(size = 5) 
# [1] 4 9 2 9 2 
r_ge(size = 5) 
# [1] 6 1 8 1 6 
r_ge(size = 5) 
# [1] 6 0 4 9 4 
r_ge(size = 5) 
# [1] 4 9 4 0 4 
+0

Не уверен, что это то, что вы имеете в виду. Количество итераций - это параметр размера, который вы передали, и общая сумма может быть рассчитана после итерации, например 'sum (r_ge (size = 5))'. – Psidom

+0

Если вы имеете в виду повторить его 1000 раз, вы можете рассчитать среднее значение из результата, например 'mean (replicate (1000, r_ge (size = 5)))'. – Psidom

+0

Эта функция выполняет возврат обратно образца определенного размера, как и все другие функции, результат можно обрабатывать так же, как и другие функции, такие как 'sample' или' rnorm'. – Psidom

3

Кроме того, я считаю, что это также делает то, что вам, что:

first_seed <- rbinom(n = 1, size = 9, prob = .5) # just to get a starting value 
for (i in 1:20){ 
    first_seed <- sample(x = unlist(List_of_lists[[as.character(first_seed)]][]), 1) 
    print(first_seed) 
} 

Несколько примечаний: rbinom() не идеально подходит для получения первого значения, но я оставляю это для вас, чтобы изменить. Кроме того, 1:20 предназначен только для демонстрационных целей, очевидно, увеличивает или уменьшает количество итераций по желанию.