Дважды Для циклов в R

Вы пробовали UNC-ресурс ?

\\server\share\foo.exe

12
задан Richard Erickson 18 May 2016 в 16:35
поделиться

3 ответа

Простите, что задаю потенциально глупый вопрос, но в каком смысле R не может этого сделать? У меня это прекрасно работает:

N <- 5
for (i in 0:(2*N)) {
   for (j in i:N) {
        print(paste(i,j,sep=","))
    }
}

Может быть, вы просто не заключили скобки в конец своей последовательности?

Изменить: Ясно ... вы хотите, чтобы последовательность i: 3 всегда <= 3? Я не думаю, что это возможно ни с последовательностью, ни с предложением оператора for. Вы можете установить разрыв внутри цикла, но это не лучше, чем ваш текущий подход:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Edit 2: Это может не соответствовать вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, что он представлен в RQuantlib .

N <- 5
for (i in 0:(2*N)) {
   for (j in i:N) {
        print(paste(i,j,sep=","))
    }
}

Может быть, вы просто не заключили скобки в конце своей последовательности?

Редактировать: Ясно ... вы хотите, чтобы последовательность i: 3 всегда была <= 3? Я не думаю, что это возможно ни с последовательностью, ни с предложением оператора for. Вы можете установить разрыв внутри цикла, но это не лучше, чем ваш текущий подход:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Редактировать 2: Это может не соответствовать вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, что он представлен в RQuantlib .

N <- 5
for (i in 0:(2*N)) {
   for (j in i:N) {
        print(paste(i,j,sep=","))
    }
}

Может быть, вы просто не заключили скобки в конце своей последовательности?

Редактировать: Понятно ... вы хотите, чтобы последовательность i: 3 всегда была <= 3? Я не думаю, что это возможно ни с последовательностью, ни с предложением оператора for. Вы можете установить разрыв внутри цикла, но это не лучше, чем ваш текущий подход:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Edit 2: Это может не соответствовать вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, что он представлен в RQuantlib .

вы хотите обеспечить, чтобы последовательность i: 3 всегда была <= 3? Я не думаю, что это возможно ни с последовательностью, ни с предложением оператора for. Вы можете установить разрыв внутри цикла, но это не лучше, чем ваш текущий подход:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Редактировать 2: Это может не соответствовать вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, выставлен ли он в RQuantlib .

вы хотите обеспечить, чтобы последовательность i: 3 всегда была <= 3? Я не думаю, что это возможно ни с последовательностью, ни с предложением оператора for. Вы можете установить разрыв внутри цикла, но это не лучше, чем ваш текущий подход:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Редактировать 2: Это может не соответствовать вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, выставлен ли он в RQuantlib .

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Редактировать 2: Это может не соответствует вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, что он представлен в RQuantlib .

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  

Вот еще один способ сгенерировать эту последовательность без цикла for:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))

Или с помощью expand.grid (согласно предложению Дирка):

x <- expand.grid(x=1:3, y=1:3)

Затем удалите нежелательные случаи:

x[x[,1] >= x[,2],]

Редактировать 2: Это может не соответствует вашим потребностям, но я считаю, что Quantlib имеет реализацию модели рынка Libor. Я не уверен, выставлен ли он в RQuantlib .

12
ответ дан 2 December 2019 в 05:28
поделиться

Конечно, вы можете вкладывать циклы:

R> for (i in 1:3) for (j in 1:3) cat(i,j,i*j, "\n")
1 1 1 
1 2 2 
1 3 3 
2 1 2 
2 2 4 
2 3 6 
3 1 3 
3 2 6 
3 3 9 
R> 

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

R> outer(1:3,1:3, "*")
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9
R> 

, но если проще разработать с помощью связанных циклов, сделайте это.

Что касается проблемы «второй индекс, зависящий от первого индекса», вы можете использовать более низкий. tri (), upper.tri () или индексирование для достижения этой цели.

R> X <- expand.grid(x=1:3, y=1:3)
R> X <- X[ X$x >= X$y, ]
R> outer(X$x, X$y, "*")
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    2    2    4    4    6
[3,]    3    3    3    6    6    9
[4,]    2    2    2    4    4    6
[5,]    3    3    3    6    6    9
[6,]    3    3    3    6    6    9
R> 
10
ответ дан 2 December 2019 в 05:28
поделиться

Проблема в том, что i: 3 имеет смысл, когда i> 3 . Например, 5: 3 дает (5,4,3) . Все, что вам нужно, это простой оператор if, чтобы предотвратить запуск второго цикла, когда i> 3 .

for (i in 1:6) {
    if(i < 4) {
        for (j in i:3) {
            print(paste(i,j,sep=","))
        }
    }
    # Do more operations for i > 3...
}

Однако, если возможно, постарайтесь избежать явного цикла. Ответы Дирка и Шейна дают некоторые идеи, как это сделать.

6
ответ дан 2 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: