enumerate <- function(x, i = "i", v = "v") {
lapply(
seq_along(x),
function(iteration) {
structure(
list(iteration, x[[iteration]]),
class = c("enumeration", "list"),
names = c(i, v)
)
}
)
}
for (e in enumerate(letters)) {
cat(sprintf("%i: %s\n", e$i, e$v))
}
#> 1: a
#> 2: b
#> 3: c
#> 4: d
#> 5: e
#> 6: f
#> 7: g
#> 8: h
#> 9: i
#> 10: j
#> 11: k
#> 12: l
#> 13: m
#> 14: n
#> 15: o
#> 16: p
#> 17: q
#> 18: r
#> 19: s
#> 20: t
#> 21: u
#> 22: v
#> 23: w
#> 24: x
#> 25: y
#> 26: z
pair <- function(...) {
p <- list(...)
stopifnot(nzchar(names(p)))
do.call(
mapply,
c(
function(...) list(...),
p,
USE.NAMES = FALSE,
SIMPLIFY = FALSE
)
)
}
for (p in pair(x = state.abb, y = state.area)) {
cat(sprintf("%s: %i\n", p$x, p$y))
}
#> AL: 51609
#> AK: 589757
#> AZ: 113909
#> AR: 53104
#> CA: 158693
#> CO: 104247
#> CT: 5009
#> DE: 2057
#> FL: 58560
#> GA: 58876
#> HI: 6450
#> ID: 83557
#> IL: 56400
#> IN: 36291
#> IA: 56290
#> KS: 82264
#> KY: 40395
#> LA: 48523
#> ME: 33215
#> MD: 10577
#> MA: 8257
#> MI: 58216
#> MN: 84068
#> MS: 47716
#> MO: 69686
#> MT: 147138
#> NE: 77227
#> NV: 110540
#> NH: 9304
#> NJ: 7836
#> NM: 121666
#> NY: 49576
#> NC: 52586
#> ND: 70665
#> OH: 41222
#> OK: 69919
#> OR: 96981
#> PA: 45333
#> RI: 1214
#> SC: 31055
#> SD: 77047
#> TN: 42244
#> TX: 267339
#> UT: 84916
#> VT: 9609
#> VA: 40815
#> WA: 68192
#> WV: 24181
#> WI: 56154
#> WY: 97914
iterate <- function(x, expr, i = "i", v = "v") {
expr <- substitute(expr)
for (e in enumerate(x, i = i, v = v)) {
eval(expr, envir = e)
}
}
iterate(
letters,
cat(sprintf("%s: %s\n", i, v))
)
#> 1: a
#> 2: b
#> 3: c
#> 4: d
#> 5: e
#> 6: f
#> 7: g
#> 8: h
#> 9: i
#> 10: j
#> 11: k
#> 12: l
#> 13: m
#> 14: n
#> 15: o
#> 16: p
#> 17: q
#> 18: r
#> 19: s
#> 20: t
#> 21: u
#> 22: v
#> 23: w
#> 24: x
#> 25: y
#> 26: z
vec_iterate <- function(x, expr, i = "i", v = "v") {
expr <- substitute(expr)
sapply(enumerate(x, i = i, v = v), function(e) eval(expr, e))
}
vec_iterate(
letters,
sprintf("%s: %s", i, v),
)
#> [1] "1: a" "2: b" "3: c" "4: d" "5: e" "6: f" "7: g" "8: h" "9: i"
#> [10] "10: j" "11: k" "12: l" "13: m" "14: n" "15: o" "16: p" "17: q" "18: r"
#> [19] "19: s" "20: t" "21: u" "22: v" "23: w" "24: x" "25: y" "26: z"Created on 2025-10-02 with reprex v2.1.1