2013-12-02 3 views
-3

Я хотел бы реализовать следующий цикл:Двойной цикла с несовместимыми значениями

for (start in c(1,2,3,4,5,6,7,8,9,10)){ 
for (to in c(1,2,3,4,5,6,7,8,9,10)){ 

runif(100,start,to) 

} 
} 

Конечно, это будет работать только тогда start меньше или равен to

Есть ли способ запуска только случаи, когда это условие выполняется?

Примечание: это упрощенная ситуация, пожалуйста, не предлагайте решения, которые устраняют цикл for.

+2

Я не понимаю, что вы пытаетесь сделать. – juba

+0

Я генерирую 100 чисел из равномерного распределения с min = start и max = to. Я хотел бы генерировать все возможные комбинации, но, конечно, я не могу сгенерировать, когда min больше max, поэтому я хотел бы как-то указать цикл for, который запускает его только для тех значений, где start> = to – user1723765

ответ

0

Я все еще не понимаю, что вы хотите сделать, и почему вы действительно хотите использовать for петли, но:

for (start in c(1,2,3,4,5,6,7,8,9)){ 
    for (to in ((start+1):10)){ 
     runif(100,start,to) 
    } 
} 
0

Почему нет:

for (start in c(1,2,3,4,5,6,7,8,9,10)){ 
    for (to in c(1,2,3,4,5,6,7,8,9,10)){ 
    if(start < to){ runif(100,start,to)} 

    } 
} 

Не так много, что произойдет, так как вы не печати или назначая этот результат ни к чему, но, по крайней мере, вы не получите предупреждающее сообщение прямо сейчас.

rnum<-numeric(0) 
for (start in c(1,2,3,4,5,6,7,8,9,10)){ 
    for (to in c(1,2,3,4,5,6,7,8,9,10)){ 
    rnum <- c(rnum, if(start < to){ runif(5,start,to)}) 
    } 
} 
str(rnum) 
# num [1:225] 1.6 1 1.57 1.75 1.11 ... 
sum(is.na(rnum)) 
#[1] 0 

Другим способом было бы просто сделать внутренние индексы петли начинаются в следующем целое число, большее, чем start (и пропустить тест):

rnum<-numeric(0) 
for (start in c(1,2,3,4,5,6,7,8,9)){ 
    for (to in (start+1):10){ 
     rnum <- c(rnum, runif(5,start,to)) 
    } 
    } 
str(rnum) 
sum(is.na(rnum)) 
+0

это было бы хорошо, но что происходит, когда условие не выполняется, могу ли я добавить точку останова, чтобы он не пропускал те циклы, где это не было выполнено? – user1723765

+0

Это не нужно. Когда условия не выполняются, соответствующее предложение игнорируется. –

+0

Право, но дальнейшие части кода нуждаются в результатах генерации случайных чисел – user1723765

0

изменения средней линии:

if(to>start)runif(100,start,to) 
+0

Примечание: это упрощенная ситуация, пожалуйста, не предлагайте решения, которые устраняют цикл for. – user1723765

+0

Да - просто измените среднюю линию; оставьте остальные, как и – Troy

+0

, но если условие не выполнено, оно не сможет генерировать числа, а остальная часть кода зависит от чисел, поэтому мне почему-то нужно опустить те петли, где условие не выполняется – user1723765

0

Если ваши возможные начальные и конечные значения фактически равны (как в вашем примере), вы можете использовать combn:

#using a loop 
start_to <- combn(1:10,2) 
n <- 2 
set.seed(42) 
randoms <- sapply(as.data.frame(start_to), function(x) runif(n, 
                  min=x[1], max=x[2])) 

#without a loop 
set.seed(42) 
randoms2 <- matrix(runif(n*ncol(start_to), 
          min=rep(start_to[1,], each=n), 
          max=rep(start_to[2,], each=n)), 
        nrow=n) 
Смежные вопросы