2017-08-30 82 views
0

我正在使用以下设置来创建图表的列表。在marrange之后无法使用ggsaveGrob

这工作得很好:

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

mycols <- c('year','displ') 

mylist <- list() 
for(item in mycols){ 

    p <- ggplot(mpg, aes_string(x = 'hwy', y = item)) + 
    geom_point() 
    mylist[[(length(mylist) +1)]] <- p 
} 

ml = marrangeGrob(grob = mylist, nrow=2, ncol=1) 
ggsave("P://multipage.pdf", ml, width =10, height = 5) 

然而,在循环中,替换:

错误$<-.data.frame*tmp* “wrapvp”,值=列表(x = 0.5,Y = 0.5,:更换有17行,数据具有234

什么是这里的问题?个别地,列表中的所有图表看起来都很好。

谢谢!

+0

嘿@MrFlick谢谢。我现在正在更新。我发现了一个有趣的bug –

+0

是的,这是真的。让我试试通常的玩具例子 –

+0

@MrFlick精彩编辑你不觉得? :) –

回答

2

这真的和marrangeGrob无关,并且与您建立清单的方式有关。比较这些方法的输出结构

out1 <- list() 
out1[[length(out1)+1]]<-list(a=1, b=2) 
out1[[length(out1)+1]]<-list(a=2, b=2) 
str(out1) 
# List of 2 
# $ :List of 2 
# ..$ a: num 1 
# ..$ b: num 2 
# $ :List of 2 
# ..$ a: num 2 
# ..$ b: num 2 

out2 <- list() 
out2 <- append(out2, list(a=1, b=2)) 
out2 <- append(out2, list(a=2, b=2)) 
str(out2) 
# List of 4 
# $ a: num 1 
# $ b: num 2 
# $ a: num 2 
# $ b: num 2 

请注意,它们会产生不同的结构。 append()将元素添加到“根”列表中,而不是将列表嵌套到列表中。你可以明确地做自己与和额外list()

out3 <- list() 
out3 <- append(out3, list(list(a=1, b=2))) 
out3 <- append(out3, list(list(a=2, b=2))) 
str(out3) 
# List of 2 
# $ :List of 2 
# ..$ a: num 1 
# ..$ b: num 2 
# $ :List of 2 
# ..$ a: num 2 
# ..$ b: num 2 

但R中环这样搞乱很少是必要的。最好使用内置迭代器,如lapply()Map()。例如

mylist <- lapply(mycols, function(item) { 
    ggplot(mpg, aes_string(x = 'hwy', y = item)) + 
    geom_point() 
}) 
+0

非常明确和有趣。谢谢!一个嵌套和unnested循环的令人讨厌的例子 –

相关问题