我有一個包含不同長度向量的串列,我需要有效地回圈這些向量。作為一個例子,我想在每個元素上使用 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])
}
}
任何幫助表示贊賞。
uj5u.com熱心網友回復:
試試看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
uj5u.com熱心網友回復:
因為您對效率感興趣,所以我添加了一個基準測驗示例來評估(1)您的方法(2)@Sotos 提出的方法(3)使用 lapply 遍歷串列元素(向量)的方法和(4)使用 lapply 和 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-代碼/。
請注意,我已更改串列的名稱,因為變數名稱不應與 r 的內置函式相同。
另外,請記住,這些函式都是列印串列中的條目,它們在迭代形式上有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/413267.html
標籤:
