У меня есть две функции, которые используют циклы 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)
Моя попытка явно не работает, и я не уверен, как устранить проблему.Я хочу, чтобы функция развернула таймер, который запускается автоматически при сборе данных.Спасибо.