使用lapply从列表列表与向量列表中提取子元素

时间:2018-11-05 00:48:33

标签: r lapply

lapply如何从列表中提取子元素?更具体地说,lapply如何从列表列表和向量列表中提取子元素?更具体地说,假设我有以下内容:

my_list_of_lists <- list(list(a = 1, b = 2), list(a = 2, c = 3), list(b = 4, c = 5))
my_list_of_lists[[1]][["a"]] # just checking
# [1] 1 
# that's what I expected

并应用以下内容:

lapply(my_list_of_lists, function(x) x[["a"]]) 
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 2
# 
# [[3]]
# NULL

因此lapply从3个子列表中的每一个中提取a元素,并在length = 3列表中包含的列表中返回每个子元素。此时,我的思维模型如下:lapplyFUN应用于my_list的每个元素,为FUN(my_list[[i]])中的i返回1:3 。大!因此,我希望我的心理模型也适用于向量列表。例如,

my_list_of_vecs <- list(c(a = 1, b = 2), c(a = 2, c = 3), c(b = 4, c = 5))
my_list_of_vecs[[1]][["a"]] # Just checking
# [1] 1
# that's what I expected

并应用以下内容:

lapply(my_list_of_vecs, function(x) x[["a"]]) 
# Error in x[["a"]] : subscript out of bounds
# Wait...What!?

这是怎么回事!?这不行吗?我在help(lapply)中找到了一个可能与之相关的部分:

  

由于历史原因,lapply创建的调用未评估,   并据此编写了代码(例如bquote)。这个   表示记录的呼叫始终为FUN(X [[i]],...)形式,   用我替换为当前(整数或双精度)索引。这不是   通常是一个问题,但可能是FUN使用sys.call或match.call   或者它是使用该调用的原始函数。这个   意味着通常可以更安全地使用   包装器,例如lapply(ll,function(x)is.numeric(x))是   需要确保为is.numeric进行方法分派   正确。

我真的不知道该怎么理解。

我认为这与以下事实有关:您可以同时使用[[[从向量中提取单个元素,但只能使用[提取元素范围。例如,

my_list_of_vecs[[1]][1:2]
# a b 
# 1 2
my_list_of_vecs[[1]][[1:2]]
# Error in my_list_of_vecs[[1]][[1:2]] : 
#   attempt to select more than one element in vectorIndex

因此,lapply必须在一定范围内使用function(x) x[["a"]]。那正确吗?

调试在这里无济于事,因为这些功能依赖于.Internal功能。

0 个答案:

没有答案
相关问题