【问题标题】:R: Break for loopR:中断循环
【发布时间】:2011-08-30 06:32:28
【问题描述】:

你能否确认下一个 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,])
       }
      }
    }

【问题讨论】:

  • 如果您对此代码有疑问,请注意in 是保留字,因此您不能将其用作变量名。

标签: r for-loop break


【解决方案1】:

嗯,你的代码是不可重现的,所以我们永远无法确定,但这就是help('break')说的:

break 由 for、while 或 重复循环;控制权转移到 外面的第一条语句 最内层循环。

所以是的,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
        }   
    }
}

【讨论】:

    【解决方案2】:

    你的 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 行并检查是否有新的数据行或删除的行。它需要几个小时才能完成工作。我正在用这样的循环来做这件事,它可能会做得更快吗?再次感谢您的宝贵帮助
    • 你需要向量化你的逻辑。假设您有一个 1-10 vector = c(1:10) 的数字向量,并且您想从每个元素中减去 1。不要用for循环来做!只需执行以下vector = vector - 1。您将不得不重写所有内容并重新考虑您的逻辑。看看?apply 是你的好朋友。发布更多代码并使用可重现的数据,也许您可​​以获得更好的帮助。
    猜你喜欢
    • 2020-02-03
    • 2016-12-09
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多