Как я могу извлечь элементы из списков списков в R?

У меня есть группа списков, содержащих списки внутри них (обобщенный вывод линейной модели). Я хочу написать функцию, которая будет извлекать несколько элементов из каждого списка, а затем объединить результаты в кадр данных.

Я хочу извлечь modelset[[1]]$likelihood и modelset[[1]]$fixef, modelset[[2]]$likelihood и modelset[[2]]$fixef и т.д. и объединить результаты в кадр данных.

Может кто-нибудь дать мне представление о том, как это сделать?

Извините, если мой вопрос путается: то, что я пытаюсь сделать, выходит за рамки ограниченного понимания программирования.

Дополнительная информация о моем списке:

modelset: Large list (16 elements, 7.3Mb)
    :List of 29
    ..$ fixef           : Named num [1:2] -1.236 -0.611
    .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "SMIstd"
    ..$ likelihood      :List of 4
    .. ..$ hlik: num 238
    .. ..$ pvh : num 256
    .. ..$ pbvh: num 260
    .. ..$ cAIC: num 567

    ...etc  

Ответ 1

Чтобы решить эту проблему, вам нужно понять, что вы можете использовать ['…'] вместо $… для доступа к элементам списка (но вы получите список назад вместо отдельного элемента).

Итак, если вы хотите получить элементы likelihood и fixef, вы можете написать:

modelset[[1]][c('likelihood', 'fixef')]

Теперь вы хотите сделать это для каждого элемента в modelset. То, что lapply делает:

lapply(modelset, function (x) x[c('likelihood', 'fixef')])

Это работает, но это не очень похожее на R.

Вы видите, что в R почти все есть функция. […] вызывает функцию с именем [ (но так как [ является специальным символом для R, то в кавычках нужно указывать: `[`). Поэтому вы можете написать это:

lapply(modelset, function (x) `[`(c('likelihood', 'fixef')])

Ничего себе, это совсем не совсем понятно. Однако теперь мы можем удалить анонимный анонимный function (x), так как внутри было просто вызов другой функции и переместить дополнительные аргументы в последний параметр lapply:

lapply(modelset, `[`, c('likelihood', 'fixef'))

Это работает и является элегантным R-кодом.


Позволяет отступить и пересмотреть то, что мы здесь сделали. По сути, у нас было выражение, которое выглядело так:

lapply(some_list, function (x) f(x, y))

И этот вызов вместо этого можно записать как

lapply(some_list, f, y)

Мы сделали именно это, с somelist = modelset, f = `[` и y = c('likelihood', 'fixef').