r-如何有效地循环遍历包含不同长度矢量的列表



我有一个包含不同长度向量的列表,我需要有效地循环这些向量。作为一个例子,我想在每个元素上使用print函数。然而,由于我会反复遇到这个问题,我想找到一种有效的方法来做到这一点

list <- list(1, c(1:4), c(3:10))
for (i in seq_along(list)) {
for(j in seq_along(list[[i]])){
print(list[[i]][j])
}
}

感谢您的帮助。

因为您对效率感兴趣,我添加了一个基准测试示例来评估(1(您的方法(2(@Sotos提出的方法(3(使用lapply迭代列表元素(矢量(的方法和(4(使用lappli和sapply迭代表列元素(矢量元素(的方法:

list2examine <- list(1, c(1:4), c(3:10))
benchmark("original"= {
for (i in seq_along(list2examine)) {
for(j in seq_along(list2examine[[i]])){
print(list2examine[[i]][j])
}
}
}, "Sotos" = {rapply(list2examine, print)},
"lapply" = {lapply(list2examine, function(x) {print(x)} )},
"lapplySapply" = {lapply(list2examine, function(x) { sapply(x, function(i) {print(i)} ) })},
"ismirsehregal" = { print(unlist(list2examine))},
replications=1000,
columns = c("test", "replications", "elapsed",
"relative", "user.self", "sys.self"))
test replications elapsed relative user.self sys.self
5 ismirsehregal         1000    0.08    1.000      0.07     0.02
3        lapply         1000    0.11    1.375      0.11     0.00
4  lapplySapply         1000    0.34    4.250      0.36     0.00
1      original         1000    2.80   35.000      2.81     0.07
2         Sotos         1000    0.14    1.750      0.17     0.00

正如你所看到的,你的方法是你所期望的最慢的("经过的"(。lapplySapply比rapply慢,我想这与rapply是一个递归函数有关。如果你想进一步阅读基准测试或如何解释函数的结果,我推荐这篇文章https://www.r-bloggers.com/2017/05/5-ways-to-measure-running-time-of-r-code/.

注意,我已经更改了您列表的名称,因为变量名称不应该与r的内置函数相同。

此外,请记住,然而,这些函数都是打印列表中的条目,它们在迭代形式上有所不同。

尝试rapply,即

rapply(list, print)
#[1] 1
#[1] 1 2 3 4
#[1]  3  4  5  6  7  8  9 10
# [1]  1  1  2  3  4  3  4  5  6  7  8  9 10

最新更新