r语言 - 嵌套的'for'循环,返回每月的每一天



我想:

[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, "daysn")
}    
}

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

你要找的是:

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], "daysn")
}

还有:在你的月份矢量

中缺少八月

p>

U12-Forward回答的启发,这也有效:
invisible(sapply(1:12, function(x) cat(month.name[x], "has", days[x], "daysn")))

我更喜欢mapply:

> invisible(mapply(function(i, j) cat(j, "has", i, "daysn"), 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并行迭代多个向量。

stringr::str_glue()提供了一个很好的替代方案。vectorised。

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包(v2.0.1)在2018-10-26创建

这是一个矢量化操作,因此您可以不使用循环或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

相关内容