如何从lapply循环调用顶级(跳过/传递)

时间:2014-11-11 20:23:32

标签: r performance for-loop lapply

我想创建一个lapply循环,如果满足某个要求,它将停止...
举个例子:

score <- 0
lapply(1:100, function(z){

    score <<- score + 1

    if(score >=10){
        break
    }
})

但是,在lapply循环中没有停止参数作为 break / pass

我知道这个例子听起来很愚蠢。但是,原始代码有太多的依赖关系,很容易理解...... 我的原始循环每次都从一个对象向量中移除一个项目,但是,如果没有其他东西可以从中删除它可以停止。 我在正常的循环短尺寸函数中获得至少0.10秒

正常&#34; for循环&#34; with skip argument

> time <- system.time({cyclopeptide_score(sequence, spectrum)})
> time
  usuário   sistema decorrido 
     6.58      0.00      6.58 

与laplly没有跳过争论

> time <- system.time({cyclopeptide_score2(sequence, spectrum)})
> time
  usuário   sistema decorrido 
     6.72      0.00      6.72 

1 个答案:

答案 0 :(得分:4)

要直接回答您的问题,这里有一个选项(假设您可以控制lapply发生的代码以及正在应用的函数):

withRestarts(
  lapply(
    1:10, 
    function(x) {
      cat(x)
      if(x > 5) invokeRestart("stopLoop")
  } ),
  stopLoop=function() message("Loop Stopped")
)

产地:

123456
Loop Stopped

基本上,withRestarts / invokeRestart有点像GOTO语句,它允许你突破循环。

所有这一切都表示,我不会将任何大代码重构工作基于6.7秒运行时间的0.1秒改进。

另外,如果您可以执行上述操作,您可以轻松地将代码转换为for循环,这似乎更合适,因为您希望a)打破循环,b)使用<<-运算符导致副作用。