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列表中包含的列表中返回每个子元素。此时,我的思维模型如下:lapply
将FUN
应用于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
功能。