Как правильно применять функции в глубоких вложенных списках? - PullRequest
0 голосов
/ 07 декабря 2018

Во вложенных списках, подобных этому

l <- list(list(list(111, 112, 113), list(121, 122, 123)),
          list(list(211, 212, 213), list(221, 222, 223)))

> str(l )
List of 2
 $ :List of 2
  ..$ :List of 3
  .. ..$ : num 111
  .. ..$ : num 112
  .. ..$ : num 113
  ..$ :List of 3
  .. ..$ : num 121
  .. ..$ : num 122
  .. ..$ : num 123
 $ :List of 2
  ..$ :List of 3
  .. ..$ : num 211
  .. ..$ : num 212
  .. ..$ : num 213
  ..$ :List of 3
  .. ..$ : num 221
  .. ..$ : num 222
  .. ..$ : num 223

мы можем применить функцию, например length() на первом уровне этим

lapply(l, length)

Но при применении функций на более глубоких вложенныхУровни размер моего кода увеличивается в геометрической прогрессии ...

# apply length() on second level
lapply(l, function(x)
  lapply(x, function(y) length(y)))

# square every list element of second level
lapply(l, function(x) 
  lapply(x, function(y) 
    lapply(y, function(z) z^2)))

Или, чтобы изменить элементы, которые появляются в определенных позициях в списках более низких уровней (то есть модификаций LHS), я понятия не имею, чем сделатьдля цикла.

# subtract 1 from first element of each second level list
for(i in sequence(length(l))) {
  l[[i]][[1]][[1]] <- l[[i]][[1]][[1]] - 1
  l[[i]][[2]][[1]] <- l[[i]][[2]][[1]] - 1
}

Я что-то пропустил?Есть ли какие-нибудь чистые решения base R ?

1 Ответ

0 голосов
/ 07 декабря 2018

В моем опыте списки нелегко освоить (надеюсь, что однажды туда доберусь).Я не знаю о волшебной пуле, но вот несколько маргинальных шагов, которые вы можете сделать, чтобы упростить ваш текущий код:

lengths(l)
# instead of
lapply(l, length)


lapply(l, lengths)
# instead of
lapply(l, function(x)
  lapply(x, function(y) length(y)))


rapply(l, function(x) x^2, how="list") # credit to Cath
# instead of
lapply(l, function(x) 
  lapply(x, function(y) 
    lapply(y, function(z) z^2)))


for (i in seq_along(l)) {
  l[[i]] <- lapply(l[[i]], function(x) {x[[1]] <- x[[1]] - 1; x})
}
# Instead of 
for(i in sequence(length(l))) {
  l[[i]][[1]][[1]] <- l[[i]][[1]][[1]] - 1
  l[[i]][[2]][[1]] <- l[[i]][[2]][[1]] - 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...