Можно ли одновременно запустить два цикла while в R? - PullRequest
1 голос
/ 03 июля 2019

У меня есть две функции, которые используют циклы while и хотят объединить их так, чтобы оба цикла выполнялись одновременно.Первая функция / цикл позволяет пользователю в интерактивном режиме вводить данные в консоль с помощью цифровых клавиш 1–5, а вторая функция / цикл отображает таймер обратного отсчета, чтобы проинформировать пользователя о том, сколько времени осталось до окончания эксперимента.Я хочу иметь возможность начать эксперимент и обратный отсчет одновременно.

Я уже безуспешно пытался объединить две функции в одну функцию:

record_data = function(x) {
require(tictoc) #load required package
require(tcltk)

time_period = readline("Length of observation period (mins): ") # requires user input
  time_period = as.numeric(time_period)

  pb <- tkProgressBar("Timer")
  start = Sys.time()

while(T){       #open infinite while loop
    tic()       #start timer
    elapsed = as.numeric(difftime(Sys.time(), start, units = 'mins'))
    remaining = time_period - elapsed
    Sys.sleep(0.1)
    setTkProgressBar(pb,
                     remaining / time_period,
                     label = sprintf("Time remaining: %i min", round(remaining)))
    if (remaining <= 0)
      break

    input_state=readline("State input: ")  #allow for entry of state
    if(input_state %in% 1:5){    #check if it's acceptable 
        elapsed=toc()            #if it is then end timer and record data
        write.table(cbind(input_state,elapsed$toc-elapsed$tic),'results.txt',col.names=F,row.names=F,quote=F,append=T)
    }else if(input_state=='t'){  #if input is 't' 
        break                    #break out of while loop
    }else if(input_state <1 | input_state > 5 & input_state!='t'){#if input is not and accepted state AND is not 't'
     print('thats not an allowed state- please try another')
     } 
  }
  Sys.sleep(2)
  close(pb)

}

Функция одна (сбор данных с помощью ввода данных пользователем в консоли):

record_data = function(x) {
require(tictoc) #load required package
while(T){       #open infinite while loop
    tic()       #start timer
    input_state=readline("State input: ")  #allow for entry of state
    if(input_state %in% 1:5){    #check if it's acceptable 
        elapsed=toc()            #if it is then end timer and record data
        write.table(cbind(input_state,elapsed$toc-elapsed$tic),'results.txt',col.names=F,row.names=F,quote=F,append=T)
    }else if(input_state=='t'){  #if input is 't' 
        break                    #break out of while loop
    }else if(input_state <1 | input_state > 5 & input_state!='t'){#if input is not and accepted state AND is not 't'
     print('thats not an allowed state- please try another')
     } 
  }
}

Вторая функция (таймер обратного отсчета эксперимента):

timer = function(x) {
  require(tcltk)
  time_period = readline("Length of observation period (mins): ")
  time_period = as.numeric(time_period)

  pb <- tkProgressBar("Timer")
  start = Sys.time()
  while (TRUE) {
    elapsed = as.numeric(difftime(Sys.time(), start, units = 'mins'))
    remaining = time_period - elapsed
    Sys.sleep(0.1)
    setTkProgressBar(pb,
                     remaining / time_period,
                     label = sprintf("Time remaining: %i min", round(remaining)))
    if (remaining <= 0)
      break
  }
  Sys.sleep(2)
  close(pb)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...