Double for循环只返回最后一项

时间:2015-11-27 09:53:55

标签: r

我有以下列表(实际列表较大但我把它缩小了以便更容易理解:

clubs <- c("Arsenal", "Chelsea", "Southhampton")

我想做的是绕过俱乐部并找到所有对手。所以在南汉普顿的情况下:

[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton

我想为所有俱乐部做这件事(阿森纳和切尔西也是如此)。

因此我写了以下代码:

 distances <- function(list) {

  #list for storing purposes
  list_new <- c()
  count <- length(list)

   #perform one loop for each club
   for (j in count) {

     for (i in list){

     #get the first club
     var <- list[j]

     #fetch list item
     var_opponent <- list(i)

     #print(var_opponent)
     var_total <- paste0(var, " VS ", var_opponent)

     print(var_total)

    list_new <- c(list_new, var_total)

    }

 }

}

它没有完全奏效,但是因为这是我的输出:

> distances(clubs)
[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton"

有人可以向我解释为什么我只能获得最后一个俱乐部的记录吗?

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误。

您需要了解的第一件事是R中的for循环遍历元素列表。让我们假设您的代码中的计数为3。然后第一个for循环将是

for(j in 3)

所以j将是列表中包含单个3的所有元素。 在下一个for循环中,您以正确的方式遍历列表。

for(i in list)

将每个俱乐部列表分配给变量i一次一个。因此,俱乐部名称(不是俱乐部名称的索引)存储在变量i中,您无需索引列表即可获得俱乐部名称。

第二个错误是使用

“索引”列表
 list(i)

这与传递给函数的list参数没有任何关系。这是对list函数的调用,这将把变量i放在一个列表中。

这就是你的代码应该是这样的

distances <- function(clubs) {

  list_new <- c()

   #perform one loop for each club
   for (club1 in clubs) {

     for (club2 in clubs){


     var_total <- paste0(club1, " VS ", club2)

     print(var_total)

    list_new <- c(list_new, var_total)

    }

 }

}

这是解决问题的更好方法

distances <-  function(clubs) combn(rep(clubs,2),2,function(x) paste(x[1] ,"VS", x[2]))

答案 1 :(得分:0)

我能够通过两次直接迭代俱乐部列表来纠正你的功能:

distances <- function(lst) {

    # list for storing purposes
    list_new <- c()
    count <- length(lst)

    # perform one loop for each club
    for (j in list) {
        for (i in list) {
            # get the first and second club
            # print(var_opponent)
            var_total <- paste0(j, " VS ", i)

            print(var_total)

            list_new <- c(list_new, var_total)
        }
    }
}

> distances(clubs)
[1] "Arsenal VS Arsenal"
[1] "Arsenal VS Chelsea"
[1] "Arsenal VS Southhampton"
[1] "Chelsea VS Arsenal"
[1] "Chelsea VS Chelsea"
[1] "Chelsea VS Southhampton"
[1] "Southhampton VS Arsenal"
[1] "Southhampton VS Chelsea"
[1] "Southhampton VS Southhampton"