【问题标题】:Using a list's assigned name from a character string in a vector从向量中的字符串使用列表的指定名称
【发布时间】: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_along1: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 就是这样 - 有效。我可以适应完整的例子。谢谢你。如果您包含作为答案,我会接受。

标签: r list


【解决方案1】:

我们可以将向量list_vec 传递给mget,它返回一个嵌套列表。我们使用lapply 提取([[data 元素并使用unlist 将此嵌套列表转换为列表。

unlist(lapply(mget(list_vec), `[[`, "data"), recursive = FALSE)

结果

#$my_list1
#[1] "a" "b" "c"

#$my_list2
#[1] "x" "y" "z"

【讨论】:

  • 在你回答之后我做了一些更多的研究(并重新记住[[是一个函数)并发现magrittr中的extract2也很有效。
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多