2016-04-23 49 views
0

我想用for loop生成ggplots的列表。用於ggplot2中的循環生成列表

sig_snp<-c("rs644045_A","rs12997044_C","rs17739727_A") 

p_re<-list() 

for (i in sig_snp){ 
test %>% dplyr::select(i,type,micro1) %>% 
ggplot(aes(factor(type),log(micor1))) + 
geom_boxplot(aes(fill = factor(i)))+ 
xlab('')+ylab('log abundance')->p_re[[i]] 
} 

的埃羅如下所示:

Error: All select() inputs must resolve to integer column positions. The following do not: * i

我已經以這種方式測試了每個i for循環:

test %>% dplyr::select(rs644045_A,type,micro1) %>% 
    ggplot(aes(factor(type),log(micor1))) + 
    geom_boxplot(aes(fill = factor(rs644045_A)))+ 
    xlab('')+ylab('log abundance') 

它的工作單,但爲什麼在循環無法正常工作?

+0

'test'在哪裏?請顯示一個可重複的例子 – akrun

+1

[關於如何給出一個可重複的例子的信息](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

+0

我認爲這是一個語法問題:如何使for循環中的'i'被識別爲沒有引號的原始名稱?當我在for循環中測試每個'i'時,它會單獨工作。 – Ming

回答

0

如果你需要保持每SNP ggplot輸出列表中,它也許是更好使用lapply將輸出列表,例如:

library(ggplot2) 

#dummy data 
test <- mtcars 

#significant SNPs 
sig_snp <- c("mpg", "cyl", "disp") 

#create list of ggplots per SNP 
p_re <- 
    lapply(sig_snp, function(i){ 

    ggplot(test, aes_string("qsec", i)) + 
     geom_point() 

    }) 

#assign names 
names(p_re) <- sig_snp 

#plot 
p_re$mpg 
1

棘手的部分是select_get()

get()答案是從這裏開始:Remove quotes from a character vector in R

然而,在我的情況下,它沒有在工作loop.I認爲這可能是由於增加一倍在我的代碼循環(我不知道)。

無論如何,有是讓它的另一種方式:

test[,c(sig_snp,"type","micro1")]%>% 
    melt(id=c("type","micro1"))%>% # head() 
    ggplot(aes(factor(type),log(micro1))) + 
    geom_boxplot(aes(fill = factor(value)))+ 
    xlab('')+ylab('log abundance')+facet_grid(.~variable) 

我的想法從這裏Looping over variables in ggplot