我有一个看起来像这样的代码块:
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。
答案 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
,因为它接受了一系列绘图作为参数,并且我发现整体上使用绘图网格更加容易。