奇怪的R嵌套用于循环行为

时间:2013-09-09 16:20:02

标签: r for-loop nested-loops

我有以下代码:

for(i in(1:5) )
{
    for(j in ( (i+1) :5) )
{
    cat (i,", ",j,"\n")

}
}

我的期望是,它会列出从1到5的所有数字对。但是,当我运行上面的R脚本时,我得到以下内容。

1 ,  2 
1 ,  3 
1 ,  4 
1 ,  5 
2 ,  3 
2 ,  4 
2 ,  5 
3 ,  4 
3 ,  5 
4 ,  5 
5 ,  6 
5 ,  5 

最后两排让我感到困惑。如果这是边界包含/排除的情况,则在1,2,3,4之后总是打印6,但它仅在5之后发生。此外,最后一对5,5也没有意义。

4 个答案:

答案 0 :(得分:4)

它完全符合您的要求:

6:5
#[1] 6 5

?`:`

了解更多信息。

答案 1 :(得分:3)

我的循环应该是,

for(i in(1:5) )
{
  for(j in ( (i) :5) )
  {
    cat (i,", ",j,"\n")

  }
}

1 ,  1 
1 ,  2 
1 ,  3 
1 ,  4 
1 ,  5 
2 ,  2 
2 ,  3 
2 ,  4 
2 ,  5 
3 ,  3 
3 ,  4 
3 ,  5 
4 ,  4 
4 ,  5 
5 ,  5 

<强>更新

为了获得与combn类似的结果,只有if(·)条件,如下所示:

for(i in(1:5) )
{
  for(j in ( (i) :5) )
  {
    if(i!=j){
      cat (i,", ",j,"\n")
    }

  }
}

这样可以避免在i等于j时打印值(我认为这就是您所谓的“重复值对”)。

答案 2 :(得分:2)

你可以使用这个:

t(combn(5, 2))

结果:

      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

答案 3 :(得分:0)

尝试写if状态。 像

这样的东西
for(i in(1:5) )
{
    if (i < 4) {
        for(j in ( (i+1) :5) )
        {
            cat (i,", ",j,"\n")
        }
    }
}