【问题标题】:Turning a character vector into an empty list with names from the character vector将字符向量转换为具有字符向量名称的空列表
【发布时间】:2020-01-24 15:12:27
【问题描述】:

给定一个字符向量:

myvec <- c("one", "two", "three")

我想把它变成一个列表,使得列表元素的名称来自字符向量并且列表本身是空的。请注意,我不知道字符向量的长度先验。我需要这个,因为稍后我会以编程方式填写此列表的每个元素。

我想要的输出:

str(mylist)

$one
NULL

$two
NULL

$three
NULL

我想出了这个:

turnList <- function(x){map(as.list(set_names(x)), ~NULL)}

它有效,一切都很好,但我觉得它可以更简单地完成......?一般来说,具有 purrr 和 tidyverse 的解决方案是理想的......

【问题讨论】:

    标签: r list function tidyverse purrr


    【解决方案1】:
    setNames(vector("list", length(myvec)), myvec)
    

    【讨论】:

      【解决方案2】:

      1) Base R 不使用任何包。

      Map(function(x) NULL, myvec)
      

      2) gsubfn 以使用包为代价,我们可以进一步缩短它:

      library(gsubfn)
      fn$Map(. ~ NULL, myvec)
      

      3) purrr 或使用 purrr(以包和代码长度中的更多字符为代价)。这类似于问题中的方法,但通过消除不需要的 as.list 来简化它。

      library(purrr)
      map(set_names(myvec), ~ NULL)
      

      注意

      此答案下方的评论指出NULL 可以替换为{}。 这将节省两个字符并适用于上述任何一个。

      【讨论】:

      • 接受了答案,因为它正在使用地图,看起来更简单,让我对我去解决这个问题的方向感觉更好。谢谢大家的好主意!
      【解决方案3】:

      我们可以使用vector

      setNames(vector("list", length = length(myvec)), myvec)
      
      #$one
      #NULL
      
      #$two
      #NULL
      
      #$three
      #NULL
      

      replicate

      setNames(replicate(length(myvec), NULL), myvec)
      

      【讨论】:

      • 我想我这次比你快 7 秒 :)。
      猜你喜欢
      • 2017-04-20
      • 2016-04-10
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2013-05-24
      相关资源
      最近更新 更多