我有一个包含不同长度向量的列表,我需要有效地循环这些向量。作为一个例子,我想在每个元素上使用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