【发布时间】:2019-03-10 18:54:07
【问题描述】:
我有一些清单:
my_list1 <- list("data" = list(c("a", "b", "c")), "meta" = list(c("a", "b")))
my_list2 <- list("data" = list(c("x", "y", "z")), "meta" = list(c("x", "y")))
我希望能够对这些列表执行一些操作,但我需要使用存储在向量中的列表名称,因为我是通过 API 调用动态创建它们的。这样的向量可能是:
list_vec <- c("my_list1", "my_list2")
我在将向量中的字符串评估为列表名称时遇到了问题。我知道已经涵盖了这个主题,但我特别坚持的部分是在assign 中运行函数时能够仅提取data 子列表。基本上是这样的情况:
library(purrr)
for(i in seq_along(1:length(list_vec))){
assign(list_vec[[i]], map_df(list_vec[[i]][["data"]], unlist))
}
这将给出以下结果:
# A tibble: 3 x 1
data
<chr>
1 a
2 b
3 c
我也可以这样做:
my_list1$meta <- NULL
与
list_vec[[1]][["meta"]] <- NULL
要将列表减少到仅data 子列表,但我不能在动态分配的名称中。
我也用eval 包装了一些东西,但无法让它工作。
所以具体来说,我需要从字符串中评估列表的名称,以便从中提取子列表。
【问题讨论】:
-
你能显示出预期的结果吗?顺便说一句,
seq_along(1:length(list_vec))中不需要seq_along,1:length(list_vec)提供相同的输出。 -
如果你想引用这样的列表(并且它们的目的相似),那么也许你应该将它们存储在一个单独的命名列表中。例如,带有
list(my_list1=list("data"=...), my_list2=list("data"=...))的单个列表,那么您可以只处理该单个列表。 -
我的意思是使用
map_df而不是map。输出将是一个df。我将添加到 OP。 -
@nycrefugee 这是您要找的东西吗:
unlist(lapply(mget(list_vec), "[[", "data"), recursive = FALSE) -
@markus 就是这样 - 有效。我可以适应完整的例子。谢谢你。如果您包含作为答案,我会接受。