Grid.arrange, используя список участков

Я чувствую, что всегда задаю один и тот же вопрос: (

Недавно я получил список графиков + таблица для отображения на grid.arrange, используя функцию do.call

library(grid)
library(ggplot2)
library(gridExtra)

g1 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=sin)
g2 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=tan)
g3 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=cos)
g4 <- tableGrob(data.frame(x <- 1:10, y<-2:11, z<-3:12))

plist <- list(g1,g2,g3,g4)
do.call("grid.arrange", c(plist))

Это работает, но мне нужно, чтобы "plist" создавался на основе переменной "numruns" Я пробовал это, но он не работает:

plist2 <- list(paste0("g", seq_len(numruns+1)))
do.call("grid.arrange", c(plist2))

Я считаю, что то, что я делаю, вызывает grid.arrange( "g1", "g2",...), а не grid.arrange(g1, g2,...). Я решил аналогичную проблему, прежде чем использовать lapply, но это, похоже, не помогает мне в этом случае, иначе я использую ее неправильно.

Спасибо за любую помощь.

Ответ 1

Вы можете использовать mget следующим образом:

plist2 <- mget(paste0("g", 1:4))
do.call(grid.arrange, plist2)

Но было бы лучше поместить графики в список при их создании, например:

funs <- c(sin, tan, cos)
DF <- data.frame(x=c(0, 10))

g <- lapply(funs, function(fun, df) {
  ggplot(df, aes(x)) + stat_function(fun=fun)
}, df=DF)

#g[[4]] <- tableGrob(data.frame(x = 1:10, y = 2:11, z = 3:12))
#better for programmatic use:
g <- c(g, list(tableGrob(data.frame(x = 1:10, y = 2:11, z = 3:12))))

do.call(grid.arrange, g)