为了优雅地解决这个问题,您需要了解可以使用['…']
代替$…
访问列表元素(但您将得到一个列表而不是单个元素)。
所以如果你想获取元素likelihood
and fixef
, 你可以写:
modelset[[1]][c('likelihood', 'fixef')]
现在您想对中的每个元素执行此操作modelset
。就是这样lapply http://stat.ethz.ch/R-manual/R-devel/library/base/html/lapply.html does:
lapply(modelset, function (x) x[c('likelihood', 'fixef')])
这可行,但不太像 R。
你看,在 R 中,几乎一切是一个函数。[…]
正在调用一个名为的函数[
(但是由于[
是R的特殊符号,in需要用反引号引起来:`[`
)。所以你可以这样写:
lapply(modelset, function (x) `[`(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 = `[`
and y = c('likelihood', 'fixef')
.