如何在R中自动执行此部分grid.arrange函数

时间:2018-11-23 16:04:19

标签: r

我有一个看起来像这样的代码块:

p1 <- plotQC(sce_1, type = "highest-expression")
p2 <- plotQC(sce_2, type = "highest-expression")
p3 <- plotQC(sce_3, type = "highest-expression")
p4 <- plotQC(sce_4, type = "highest-expression")
grid.arrange(p1,p2,p3,p4,ncol=2)

这很好用,没有错误或警告。

我想绕个圈。我所做的是

 for (i in 1:length(paths))
    assign(paste0("p",i), plotQC(get(paste0("sce_",i)), type = "highest-expression"))
    grid.arrange(p1,p2,p3,p4,ncol=2)

第二个块也可以很好地工作。但是,我想使grid.arrange在不手动通知p1,p2,p3,p4的情况下工作,但是它应该检测到p个对象的数量。

我该怎么做?我正在使用R markdown。

2 个答案:

答案 0 :(得分:1)

虽然所有这些方法都有效,但我认为您会同意以下内容会更好,因为它绝不需要您重复任何行或手动指定一些数字:

sce <- list(sce_1, sce_2, sce_3, sce_4)
p <- lapply(sce, plotQC, type = "highest-expression")
do.call(grid.arrange, c(p, ncol = 2))

尤其是在这种情况下,使用列表要好得多。为此,您可能还应该以不同的方式生成sce_1,...,sce_4作为列表元素。

答案 1 :(得分:1)

如果您想保持循环,也可以尝试以下方法:

p.list <- list()
for (i in 1:length(paths)){
  p <- plotQC(get(paste0("sce_",i)), type = "highest-expression")
  p.list[[i]] <- p
}
cowplot::plot_grid(plotlist = p.list)

在这里,我们将其保存在名为p.list的列表中,而不是分配图解,然后从该列表构建网格。我使用了plot_grid中的cowplot,因为它接受了一系列绘图作为参数,并且我发现整体上使用绘图网格更加容易。