r вывести следующий элемент списка в цикле for

Я хотел бы напечатать песню-бутылку (см. Https://en.wikipedia.org/wiki/Ten_Green_Bottles ).

Мой код цикла выглядит так:

number <- c("Ten", "Nine", "Eight", "Seven", "Six", "Five", "Four", "Three", "Two")
and_if <- ("And if one green bottle should accidentally fall,")

bottles <- function() {
  for (num in number) {
    cat(str_c(rep(num, 2), " green bottles hanging on the wall", collapse = "
"), "
", and_if, "
", "There'll be", number[2], "green bottles hanging on the wall", "
", "
")
    if (num == "Two") {
   cat(str_c(rep("One green bottle hanging on the wall", 2), collapse = "
"), "
", and_if, "
", "There'll be no green bottles hanging on the wall", "
", "
")     
    }
  }
}

bottles()

И результат такой:

Ten green bottles hanging on the wall
Ten green bottles hanging on the wall 
 And if one green bottle should accidentially fall, 
 There'll be Nine green bottles hanging on the wall 

Nine green bottles hanging on the wall
Nine green bottles hanging on the wall 
 And if one green bottle should accidentially fall, 
 There'll be Nine green bottles hanging on the wall 

Eight green bottles hanging on the wall
Eight green bottles hanging on the wall 
 And if one green bottle should accidentially fall, 
 There'll be Nine green bottles hanging on the wall 

... (и так далее) ...


One green bottle hanging on the wall
One green bottle hanging on the wall 
 and if one green bottle should accidentally fall, 
 There'll be no green bottles hanging on the wall 

Таким образом, в данный момент в последней строке каждого абзаца написано «На стене будет висеть девять зеленых бутылок» (за исключением одного пункта бутылки). То, что я хотел бы иметь следующий номер из списка, а не всегда "Девять". Я думаю, вы понимаете, о чем я.

Это не кажется слишком сложным, но я просто не мог найти ответ .. Можете ли вы помочь мне? Благодарность!

Всего 1 ответ


Это может быть зациклено по последовательности, а затем извлечь значение на основе индекса

library(stringr)
bottles <- function() {
  for (i in seq_along(number)) {
    cat(str_c(rep(number[i], 2), " green bottles hanging on the wall", collapse = "
"), "
", and_if, "
", "There'll be", replace(number[i+1], is.na(number[i+1]), "no"), "green bottles hanging on the wall", "
", "
")
    if (i == length(number)) {
   cat(str_c(rep("One green bottle hanging on the wall", 2), collapse = "
"), "
", and_if, "
", "There'll be no green bottles hanging on the wall", "
", "
")     
    }
  }
}

bottles()

Есть идеи?

10000