Как вызвать верхний уровень из цикла lapply (пропустить/пропустить)

Я хочу создать плавный цикл, который при выполнении определенного требования остановится...
в качестве примера:

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

    score <<- score + 1

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

Тем не менее, нет аргумента остановки, как break/pass в зацикленном цикле.

Я знаю, что этот пример звучит глупо. Однако исходный код имеет слишком много зависимостей, чтобы его можно было легко понять... Мой исходный цикл удаляет элемент из вектора каждый раз, когда объект, однако, если больше нечего удалять, он может остановиться. Я получаю по крайней мере 0,10 секунды с этим в обычной короткой функции цикла

с обычным циклом 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 

person Rodrigo de Alexandre    schedule 11.11.2014    source источник


Ответы (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, который кажется более подходящим, учитывая ваше желание: а) выйти из цикла, б) использовать оператор <<- для получения побочных эффектов.

person BrodieG    schedule 11.11.2014
comment
Спасибо, BrodieG сработал как шарм, кстати, почему ‹‹- вызывает побочные эффекты? - person Rodrigo de Alexandre; 14.11.2014
comment
@RodrigoBertollodeAlexandre, термин «побочные эффекты» в программировании относится к функциям, влияющим на среду программирования, кроме как через их возвращаемое значение. <<- устанавливает значение переменной вне области действия функции, поэтому это считается побочным эффектом. Побочные эффекты могут быть проблематичными, потому что это означает, что при программировании вы должны думать не только о входных и выходных значениях функции, что ограничивает полезность функций как модульных компонентов. - person BrodieG; 14.11.2014