2014-05-09 66 views
12

我覺得我總是問同樣的問題:(的變化列表grid.arrange使用地塊

我最近買了使用do.call函數圖的列表+表上顯示grid.arrange

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之前解決了類似的問題,但在這種情況下似乎沒有幫助我,否則我錯誤地使用它。

感謝您的任何幫助。

+2

你似乎在尋找' mget'。你需要它表明你真正的問題是你如何產生情節。它們應該在生成時放入列表中,而不是保存爲單獨的對象。 – Roland

+0

感謝羅蘭,之前我遇到過mget,不幸的是在沒有完全理解的情況下使用它。看起來我的過程可能不正確?有沒有類似的例子,你可以指向我? – user3564760

+1

你在'[r] mget ggplot'上搜索過嗎?我很肯定你會找到工作的例子。 –

回答

13

您可以使用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) 
+0

謝謝羅蘭。我每天都會被提醒我在R中學到了多少。使用mget是我所要求的,但是感謝您提供關於如何將這些圖表本身放入列表中的信息。我以前見過這種解釋,似乎是最好的做法。 – user3564760