2017-05-25 113 views
0

我试图用多个for循环条件生成几个R图(“素食”包的输出)以将我的数据集子集化。 如果我只使用一个条件,我将检索我想要的图,但是如果我链接for循环,则不会创建预期条件数。R - 用于生成并保存图的多个循环

我的数据帧是类似于:

my_df<- data.frame(Cruise = sample(c("cruise2016" ,"cruise2008" ,"cruise2012" ,"cruise2014" ,"cruise2011"), 50, replace=T), 
       Depth_interval = sample(c("100","200","500"), 50, replace = T), 
       data.frame(matrix(sample(1:100,300,replace=T), nrow=50))) 

我用两个列表作为条件的循环:

cruise.list <- unique(my_df$Cruise) 
interval.list <- unique(my_df$Depth_interval) 

有了这些名单,我想绘制所有的深度区间(3 (5个唯一身份证)

for (i in seq_along(cruise.list)) { 

    for (i in seq_along(interval.list)) { 

    pdf(paste("my_path", 
       cruise.list[i], 
       interval.list[i], 
       ".pdf", sep="")) 

    df <- my_df %>% 

     filter(
     Cruise == cruise.list[i], 
     Depth_interval == interval.list[i]) 

    df.nmds <- metaMDS(df, trymax = 1000, k = 3, distance = "bray") 

    # Plot 
    ordiplot(df.nmds, disp="sites", type="p", cex.lab=1.3) 
    title(main=paste(cruise.list[i], "\n", interval.list[i],"\n", "stress : ", round(df.nmds$stress,2),sep=""), cex.main=1.5) 

    dev.off() 

    } 

} 

有了这段代码,我只得到3个地块而不是15个地块预期。我猜想for循环是按照R不会像我期望的那样读取条件的顺序。

感谢您的帮助,

最好成绩

+3

您不能在两个循环中都使用'i'作为循环变量,它将始终采用内循环的值。使用'i'和'j',或者甚至更好:'current_cruise'和'current_interval'。 – Marius

+0

谢谢,完美的作品!简单的错误,大问题! – Rhiz

回答

0

你已经在这两个循环使用相同的“循环变量”。 For循环的工作方式是将序列的当前值分配给您指定的变量,因此在嵌套循环中,首先将当前巡航分配给i,然后立即使用当前时间间隔覆盖i,而您没有办法再访问​​当前巡航,以下EG:

cruise_list = c("Princess", "White Star") 
interval_list = c("Summer", "winter") 

for (i in cruise_list) { 
    print(paste("Outer loop: i =", i)) 
    for (i in interval_list) { 
     print(paste("Inner loop: i =", i)) 
    } 
} 
[1] "Outer loop: i = Princess" 
[1] "Inner loop: i = Summer" 
[1] "Inner loop: i = winter" 
[1] "Outer loop: i = White Star" 
[1] "Inner loop: i = Summer" 
[1] "Inner loop: i = winter" 

另外请注意,您可以直接遍历像cruise_list载体如我之前所做的那样,而无需通过seq_along去和生成索引,直接做这样可能帮助你尽早注意问题。

+0

感谢您的解决方案!工作得很好! – Rhiz