我想创建一个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)使用<<-
运算符造成副作用,这似乎更合适。