Как вызвать верхний уровень из цикла lapply (пропустить / пройти)
Я хочу создать цикл lapply, который, если удовлетворяет определенному требованию, остановится...
В качестве примера:
score <- 0
lapply(1:100, function(z){
score <<- score + 1
if(score >=10){
break
}
})
Однако в цикле lapply нет аргумента stop как break/pass.
Я знаю, этот пример звучит глупо. Тем не менее, исходный код имеет слишком много зависимостей, чтобы его было легко понять... Мой оригинальный цикл удаляет элемент из вектора, объект каждый раз, однако, если от него больше ничего не удаляется, он может остановиться. Я получаю по крайней мере 0,10 секунды с этим в обычной функции короткого размера цикла
с нормальным "для цикла" с аргументом пропуска
> time <- system.time({cyclopeptide_score(sequence, spectrum)})
> time
usuário sistema decorrido
6.58 0.00 6.58
с Лапли без пропуска аргумента
> time <- system.time({cyclopeptide_score2(sequence, spectrum)})
> time
usuário sistema decorrido
6.72 0.00 6.72
1 ответ
Чтобы прямо ответить на ваш вопрос, вот вариант (при условии, что у вас есть некоторый контроль над кодом, где 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, который позволяет вырваться из цикла.
Все это говорит о том, что я не буду основывать большие усилия по рефакторингу кода на 0,1 секундном улучшении на 6,7 секунд времени выполнения.
Кроме того, если вы можете сделать выше, вы, вероятно, так же легко превратить свой код в for
цикл, который кажется более подходящим, учитывая ваше желание а) выйти из цикла, б) использовать <<-
Оператор вызывает побочные эффекты.