R language развивает парадигму векторной работы с данными. Это означает, что работа с объектом (вектором, списком и т.д.) происходит не последовательно от элемента к элементу, а параллельно со всеми элементами данных объектов. Такой подход позволяет существенно ускорить операции над векторами, списками, матрицами и т.д.
Команды for, loop предоставляют последовательный (медленный) доступ к элементам данных, команды *apply предоставляют параллельный (быстрый) доступ.
Создание вложенного списка
inside_list <- list() outside_list <- list() for(i in 1:5) { for(j in 1:5) { inside_list[[j]] <- i*j } outside_list[[i]] <- inside_list }
Элементы первого внешнего списка
laply(ousidelist[[1]], identity) [1] 1 2 3 4 5
Все элементы вложенного списка
laply(outside_list, function(x) laply(x, identity)) 1 2 3 4 5 [1,] 1 2 3 4 5 [2,] 2 4 6 8 10 [3,] 3 6 9 12 15 [4,] 4 8 12 16 20 [5,] 5 10 15 20 25
Извлечение квадратного корня из каждого элемента вложенного списка
laply(outside_list, function(x) laply(x, function(x) sqrt(x))) 1 2 3 4 5 [1,] 1.000000 1.414214 1.732051 2.000000 2.236068 [2,] 1.414214 2.000000 2.449490 2.828427 3.162278 [3,] 1.732051 2.449490 3.000000 3.464102 3.872983 [4,] 2.000000 2.828427 3.464102 4.000000 4.472136 [5,] 2.236068 3.162278 3.872983 4.472136 5.000000
install.packages("dendextend", dependencies = TRUE, repos = "http://cran.rstudio.com/")