r-如何从lapply循环调用顶级(跳过/通过)



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

score <- 0
lapply(1:100, function(z){
    score <<- score + 1
    if(score >=10){
        break
    }
})

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

我知道这个例子听起来很愚蠢。然而,原始代码有太多的依赖项,很难理解。。。我的原始循环每次都会从向量中删除一个项目——一个对象,但是,如果没有其他东西可以删除,它可以停止。在一个正常的循环短尺寸功能中,我已经获得了至少0.10秒的增益

带有带skip参数的普通"for循环"

> 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 

要直接回答您的问题,这里有一个选项(假设您可以控制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)使用<<-运算符造成副作用,这似乎更合适。

相关内容

最新更新