R:跳出for循环

67

您能确认一下下一个break是否会取消内部for循环吗?

   for (out in 1:n_old){

     id_velho <- old_table_df$id[out]
      for (in in 1:n)
      {
       id_novo <- new_table_df$ID[in]
       if(id_velho==id_novo)
       {
        break
       }else 
       if(in == n)
       {
       sold_df <- rbind(sold_df,old_table_df[out,])
       }
      }
    }

11
如果您在使用此代码时遇到问题,请注意“in”是一个保留字,因此您不能将其用作变量名。 - Hong Ooi
2个回答

107

嗯,由于您的代码无法重现,所以我们永远不会确定,但这是help('break')的内容:

break用于跳出for、while或repeat循环;控制转移到最内层循环之外的第一条语句。

所以是的,break仅中断当前循环。您可以通过以下示例看到其作用:

for (i in 1:10)
{
    for (j in 1:10)
    {
        for (k in 1:10)
        {
            cat(i," ",j," ",k,"\n")
            if (k ==5) break
        }   
    }
}

24

你的break语句应该跳出for (in in 1:n)循环。

个人总是对break语句保持警惕,并通过打印到控制台来进行二次检查,以确保我实际上正在跳出正确的循环。因此,在测试之前,请添加以下语句,它将让您知道是否在达到结尾之前就已经跳出了循环。不过,我不知道您如何处理变量n,所以我不知道它是否对您有帮助。请设置一个测试值n,您事先知道它是否应该在到达n之前跳出。

for (in in 1:n)
{
    if (in == n)         #add this statement
    {
        "sorry but the loop did not break"
    }

    id_novo <- new_table_df$ID[in]
    if(id_velho==id_novo)
    {
        break
    }
    else if(in == n)
    {
        sold_df <- rbind(sold_df,old_table_df[out,])
    }
}

非常感谢!我认为这是真的,它出了问题。我的疑虑主要是因为我正在比较大约30000行的两个数据框,并检查是否有新的数据行或删除的行。这需要几个小时才能完成。我正在使用像这样的循环来完成它,可能有更快的方法吗?再次感谢您的宝贵帮助。 - Rui Morais
3
你需要向量化你的逻辑。假设你有一个数字向量1-10 vector = c(1:10),你想从每个元素中减去1。不要使用for循环来实现!只需简单地执行以下操作vector = vector - 1。你将不得不重写所有内容并重新思考你的逻辑。可以查看?apply,它是你的好朋友。如果你能提供可重现的数据和更多代码,也许就能获得更好的帮助。 - msikd65

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接