在列表元素内复制以生成嵌套列表

replicate within list element to make nested list

假设我们有

a <- list(letters[1:4],letters[5:6])

我们如何在每个元素中复制以获得像

这样的列表
b <- list(list(letters[1:4],letters[1:4]),list(letters[5:6],letters[5:6]))

我可以制作一个空列表,让 a[1] 和 a[2] 用复制的向量填充它,然后将它们全部添加到一个大列表中。

但我认为应该有一个我想念的快速方法?

我做到了

lapply(a, function(x){replicate(2,x, simplify=FALSE)})

但是索引看起来很奇怪 例如

[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] "a" "b" "c" "d"

[[1]][[1]][[2]]
[1] "a" "b" "c" "d"

您可以将 replicate 应用于列表中的每个元素。在这里我们使用 lapply:

lapply(a, replicate, n=2, simplify=F)

nsimplify 是由 lapply 转发给 replicate 的参数(参见 ?replicate)。这会产生:

List of 2
 $ :List of 2
  ..$ : chr [1:4] "a" "b" "c" "d"
  ..$ : chr [1:4] "a" "b" "c" "d"
 $ :List of 2
  ..$ : chr [1:2] "e" "f"
  ..$ : chr [1:2] "e" "f"

请注意,为清楚起见,我们显示的是 str(...) 的输出,而不是实际结果。

这是一种选择:

lapply(a, function(X) rep(list(X), 2))
# [[1]]
# [[1]][[1]]
# [1] "a" "b" "c" "d"
# 
# [[1]][[2]]
# [1] "a" "b" "c" "d"
# 
# 
# [[2]]
# [[2]][[1]]
# [1] "e" "f"
# 
# [[2]][[2]]
# [1] "e" "f"