【问题标题】:How to create a list with names but no entries in R/Splus?如何在 R/Splus 中创建一个有名称但没有条目的列表?
【发布时间】:2011-08-06 23:28:30
【问题描述】:

我想建立一个列表,其中包含未初始化的已命名条目(我计划稍后向它们添加内容)。人们通常如何做到这一点?我已经完成了:

mylist.names <- c("a", "b", "c")
mylist <- as.list(rep(NA, length(mylist.names)))
names(mylist) <- mylist.names

但这似乎有点老套。必须有一种更标准的方式来做到这一点......对吗?

【问题讨论】:

标签: r s-plus


【解决方案1】:

我会这样做:

mylist.names <- c("a", "b", "c")
mylist <- vector("list", length(mylist.names))
names(mylist) <- mylist.names

【讨论】:

  • 有设置名字的功能:setNames(vector("list", length(mylist.names)), mylist.names).
  • 这始终取决于您要归档的内容。我通常喜欢分解步骤以使阅读代码更容易。 R / Splus 倾向于让您在一行中编写相当多的东西 - 这对于测试和快速完成来说很好,但不利于可读性。
【解决方案2】:

比 Thilo 短一点的版本 :)

mylist <- sapply(mylist.names,function(x) NULL)

【讨论】:

  • 我喜欢。要添加的一件事,如果您的名字是数字,则数字值将被忽略为名称,而仅使用 1、2、3...。要避免这种情况,请尝试:sapply(as.character(4:6),function(x) NULL)
  • 您可以使用mylist &lt;- purrr::map(mylist.names, ~ NULL)sapply 替换为purrr::map
  • 但是,你需要使用names(mylist) &lt;- mylist.names
  • 两全其美? lapply(mylist.names, function(x) NULL) %&gt;% setNames(mylist.names)
【解决方案3】:

另一种棘手的方法:

mylist.names <- c("a", "b", "c") 

mylist <- NULL
mylist[mylist.names] <- list(NULL)

这是有效的,因为您替换了不存在的条目,所以它们被创建了。不幸的是,需要 list(NULL),因为 NULL 意味着删除一个条目:

x <- list(a=1:2, b=2:3, c=3:4)
x["a"] <- NULL # removes the "a" entry!
x["c"] <- list(NULL) # assigns NULL to "c" entry

【讨论】:

  • 我可能会使用mylist &lt;- list(),因为它更清楚地表明您正在初始化一个空列表。实际上,我对它可以将其设置为 NULL 感到有些惊讶。我假设 mylist 在您以这种方式分配时会从 NULL 提升到列表。
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
相关资源
最近更新 更多