Ответ 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')
.