Вы можете смоделировать идею за циклами, все еще используя lapply
, передав числовой вектор в lapply
и затем используя его в качестве индекса для извлечения элементов из списка, который вы хотите. Это, вероятно, не имеет смысла, но, надеюсь, пример иллюстрирует, что я имею в виду:
lapply(seq_along(r), function(i)dput(r[i]))
structure(list(a = structure(1:4, unit = "test")), .Names = "a")
structure(list(b = "abc"), .Names = "b")
[[1]]
[[1]]$a
[1] 1 2 3 4
attr(,"unit")
[1] "test"
[[2]]
[[2]]$b
[1] "abc"
Основная идея заключается в том, что seq_along(x)
возвращает последовательность той же длины, что и x
. Например:
> seq_along(r)
[1] 1 2
Подробнее см. ?seq_along
.
EDIT
Кажется, это немного быстрее, чем индексирование по имени:
library(rbenchmark)
benchmark(
xx <- lapply(names(r), function(i)dput(r[i])),
yy <- lapply(seq_along(r), function(i)dput(r[i])),
replications=10000)
test replications elapsed relative user.self
1 xx <- lapply(names(r), function(i) dput(r[i])) 10000 1.95 1.026316 1.70
2 yy <- lapply(seq_along(r), function(i) dput(r[i])) 10000 1.90 1.000000 1.66
sys.self user.child sys.child
1 0.00 NA NA
2 0.01 NA NA