Добавление критерия остановки в функцию в качестве входного параметра в R

#r #function #loops

Вопрос:

У меня есть что-то вроде следующего цикла, в R котором я могу работать в течение определенного времени или количества итераций:

 n_iteration lt;- 1  time_elapsed lt;-0 t1 lt;- Sys.time()  

Чтобы запустить его на определенный срок:

 while (time_elapsed lt;= 10) {    t2 lt;- Sys.time()  time_elapsed lt;- time_elapsed   (t2-t1)  print(paste0('Time elapsed:', time_elapsed, ' Iteration no:', n_iteration))    n_iteration lt;- n_iteration 1   }  

Чтобы запустить его для нескольких циклов:

 while (n_iteration lt;= 10) {    t2 lt;- Sys.time()  time_elapsed lt;- time_elapsed   (t2-t1)  print(paste0('Time elapsed:', time_elapsed, ' Iteration no:', n_iteration))    n_iteration lt;- n_iteration 1   }  

Запуск любого из них решит эту задачу. Но как это можно обернуть в функцию, в которой я могу указать, какие критерии использовать для остановки? Я хочу добиться этого, не повторяя код.

Мой утомительный и неоптимальный подход:

 loop_func lt;- function(stopping_criteria='STEPS') {  n_iteration lt;- 1    time_elapsed lt;-0  t1 lt;- Sys.time()    if(stopping_criteria=='TIME'){  while (time_elapsed lt;= 10) {    t2 lt;- Sys.time()  time_elapsed lt;- time_elapsed   (t2-t1)  print(paste0('Time elapsed:', time_elapsed, ' Iteration no:', n_iteration))    n_iteration lt;- n_iteration 1    }  }else{  while (n_iteration lt;= 10) {    t2 lt;- Sys.time()  time_elapsed lt;- time_elapsed   (t2-t1)  print(paste0('Time elapsed:', time_elapsed, ' Iteration no:', n_iteration))    n_iteration lt;- n_iteration 1    }  }   }  

Можно ли это сделать, не копируя while цикл дважды?

Комментарии:

1. @RonakShah Я добавил свой подход. В принципе, я хочу получить результат без повторения while цикла, как я показал.

Ответ №1:

Вы можете написать другую функцию для while цикла —

 while_function lt;- function(x) {  while (x lt;= 10) {  t2 lt;- Sys.time()  time_elapsed lt;- time_elapsed   (t2-t1)  print(paste0('Time elapsed:', time_elapsed, ' Iteration no:', x))  x lt;- x 1    } }  loop_func lt;- function(stopping_criteria='STEPS') {  n_iteration lt;- 1  time_elapsed lt;-0  t1 lt;- Sys.time()  if(stopping_criteria=='TIME'){  while_function(time_elapsed)  }else{  while_function(n_iteration)  } }  

Комментарии:

1. Это в какой-то степени решает поставленную цель. Но что, если у меня есть несколько параметров, которые мне нужны для ввода в функцию while. Можно ли это сделать с помощью такого подхода?