对列表列表

时间:2017-04-07 15:31:18

标签: r image list lapply

如何在列表列表的每个元素上执行相同的功能(此处:load.image)?

起点是两个列表的列表:

list1 <- list(c("Group1", "Group2", "Group3"))
list2 <- list(c("GroupA", "GroupB", "GroupC"))
list.all <- c(list1,list2)

我编写了这个迭代地应用lapply的函数:

    images.list.function <- lapply(
      designs.path.list, 
      FUN = function(secondlevel.list) 
        lapply(secondlevel.list, function(x) load.image(x))
    )
    # read all jpgs into a list
    images.list <- images.list.function
    images.list

这是正常的,但我想要一种独立于级别数的格式,因为将来可能会添加第三或第四级。

有什么优雅的想法吗?

3 个答案:

答案 0 :(得分:2)

我找到了一个比R. Schifini优雅的解决方案还要简单的新解决方案,所以现在我回答自己的问题:)

apply系列还提供了一个称为rapply的递归版本,它在嵌套列表上非常有效,请参见these examples

将其应用于该问题,解决方案很简单:

images.list <- rapply(designs.path.list, load.image)

这就是全部。

答案 1 :(得分:1)

这有用吗?

flatList = unlist(list.all)
[1] "Group1" "Group2" "Group3" "GroupA" "GroupB" "GroupC"

使用unlist,您最终会得到一个向量。然后使用lapply和图像加载功能。

例如,使用paste函数将"-image"添加到每个名称:

d = lapply(flatList, function(x){paste(x, "-image", sep = "")})
> d
[[1]]
[1] "Group1-image"

[[2]]
[1] "Group2-image"

[[3]]
[1] "Group3-image"

[[4]]
[1] "GroupA-image"

[[5]]
[1] "GroupB-image"

[[6]]
[1] "GroupC-image"

答案 2 :(得分:0)

我喜欢R. Schifini的答案。但是,仅需一点点调味,您也可以访问do.call。

只需反复执行一次do调用即可:

do.call(c,do.call(c,list.all))...

应该为您提供所有项目的向量...