【问题标题】:A nested 'for' loop that returns each day of the month一个嵌套的“for”循环,返回每月的每一天
【发布时间】:2021-12-11 16:30:12
【问题描述】:

我想要:

[1] "January has 31 days"
[1] "February has 29 days"
[1] "March has 31 days"
[1] "April has 30 days"
[1] "May has 31 days"
[1] "June has 30 days"
[1] "July has 31 days"
[1] "August has 31 days"
[1] "September has 30 days"
[1] "October has 31 days"
[1] "November has 30 days"
[1] "December has 31 days"

到目前为止我已经尝试过:

days <- c("31","29","31","30","31","30","31","31","30","31","30","31")
months <- c("January", "Februari", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

for (i in days){
  for (j in months){
      cat(j, "has", i, "days\n")
   }    
}

我创建的循环返回每个 j 和 i 12*12 次,这是不正确的。

【问题讨论】:

  • 您的规范说的是 "February",但在代码中它是 "Februari"。荷兰人?瑞典语?

标签: r loops for-loop


【解决方案1】:

你要找的是:

days <- c("31","29","31","30","31","30","31","31","30","31","30","31")
months <- c("January", "Februari", "March", "April", "May", "June", "July", "September", "October", "November", "December")

for (i in seq_along(days)){ # seq works but as commented seq_along is the better option

    cat(months[i], "has", days[i], "days\n")

  }

另外:您的月份向量中缺少 August

PS

by U12-Forward's answer 的启发,这同样有效:

invisible(sapply(1:12, function(x) cat(month.name[x], "has", days[x], "days\n")))

【讨论】:

  • 我建议使用seq_along() 而不是seq()。在这种情况下,它们做同样的事情,但seq() 几乎可以做任何事情,只要它的参数有一个为其定义方法的类,而seq_along 要简单得多。
  • 你是 100% 正确的 - 更新了我的答案
【解决方案2】:

我更喜欢mapply

> invisible(mapply(function(i, j) cat(j, "has", i, "days\n"), days, months))
January has 31 days
Februari has 29 days
March has 31 days
April has 30 days
May has 31 days
June has 30 days
July has 31 days
August has 31 days
September has 30 days
October has 31 days
November has 30 days
December has 31 days
>

注意:我添加了invisible,所以mapply的实际结果没有打印出来。


mapply 并行遍历多个向量。

【讨论】:

  • @D.J Yeap :) 你也用一个很好的答案解决了 OP 的原始问题:D,我提供了一个替代方案。
【解决方案3】:

stringr::str_glue() 提供了一个不错的选择。它是矢量化的。

library("stringr")

days <- c("31", "29", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31")
months <- c("January", "February", "March", "April", "May", "June", "July","August", "September", "October", "November", "December")

str_glue("{months} has {days} days")
#> January has 31 days
#> February has 29 days
#> March has 31 days
#> April has 30 days
#> May has 31 days
#> June has 30 days
#> July has 31 days
#> August has 31 days
#> September has 30 days
#> October has 31 days
#> November has 30 days
#> December has 31 days

reprex package (v2.0.1) 于 2021 年 10 月 26 日创建

【讨论】:

    【解决方案4】:

    这是一个矢量化操作,因此您可以在没有循环或apply 语句的情况下执行此操作。

    sprintf('%s has %s days', months, days)
    
    # [1] "January has 31 days"   "Februari has 29 days"  "March has 31 days"
    # [4] "April has 30 days"     "May has 31 days"       "June has 30 days"
    # [7] "July has 31 days"      "August has 31 days"    "September has 30 days"
    #[10] "October has 31 days"   "November has 30 days"  "December has 31 days"
    

    出于显示目的,如果您希望每个语句都换行 -

    cat(paste0(sprintf('%s has %s days', months, days), collapse = '\n'))
    
    #January has 31 days
    #Februari has 29 days
    #March has 31 days
    #April has 30 days
    #May has 31 days
    #June has 30 days
    #July has 31 days
    #August has 31 days
    #September has 30 days
    #October has 31 days
    #November has 30 days
    #December has 31 days
    

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多