【问题标题】:How to create list of lists, where every first-level list element is assigned the same list如何创建列表列表,其中每个第一级列表元素都分配有相同的列表
【发布时间】:2018-07-08 19:54:02
【问题描述】:

标题听起来很混乱,但这些是我使用的搜索词,但没有找到解决方案。

假设我有一个列表。我想为该列表的每个索引元素分配另一个列表。假设要分配的列表是:

listChildren <- vector("list", length(childrenNames))

另一个列表,它将是分配给每个条目的父列表,是:

parentList <- vector("list",length(parents))

我能弄清楚如何将 parentList 中的每个列表元素分配给 listChildren 的唯一方法是循环并分配给每个索引。这似乎非常不像R。所以我正在寻找一种更有效的方法来做到这一点。

  i <- 1
  for (name in parentList) {
    # Bad!
    parentList[[i]] <- listChildren
    i <- i + 1
  }

【问题讨论】:

  • 您能否编辑您的问题以更清楚地说明您要在这里做什么?
  • 试图让@TimBiegeleisen 更清楚
  • Indrajeet 得到了它@thelatemail

标签: r list loops recursion vector


【解决方案1】:

据我所知,这只是:

parentList[] <- list(listChildren)

验证(我认为?):

listChildren <- as.list(1:5)
parentList <- vector("list", 5)

  i <- 1
  for (name in parentList) {
    # Bad!
    parentList[[i]] <- listChildren
    i <- i + 1
  }
pl1 <- parentList

listChildren <- as.list(1:5)
parentList <- vector("list", 5)

parentList[] <- list(listChildren)
pl2 <- parentList

identical(pl1, pl2)
#[1] TRUE

这应该与在大集合上进行一些快速测试所获得的效率差不多:

listChildren <- as.list(1:1000)
parentList <- vector("list", 5e6)

system.time(parentList[] <- list(listChildren))
# user  system elapsed 
# 0.03    0.00    0.03 

listChildren <- as.list(1:1000)
parentList <- vector("list", 5e6)

system.time(purrr::map(.x = parentList, .f = function(x) {x <- listChildren}))
# user  system elapsed 
# 3.65    0.00    3.65 

【讨论】:

  • 比 purr map 功能好多了(太慢了)。谢谢。
【解决方案2】:

下面的呢?

purrr::map(.x = parentList, .f = function(x) {x <- listNames})

【讨论】:

  • 矢量有效吗?
  • @incodeveritas 抱歉,不确定效率。也许其他人可以评论这方面。
猜你喜欢
  • 2016-09-13
  • 2015-04-19
  • 1970-01-01
  • 2020-05-26
  • 2017-01-12
  • 2015-01-31
  • 2019-02-01
  • 2023-02-01
相关资源
最近更新 更多