Перезаписать ток в консоли R
Я играл с функцией R txtProgressBar(). Как я могу удержать способность функции перезаписать текущий вывод в консоли?
то есть. индикатор выполнения обновляется следующим образом:
> some R function
============
становится
> some R function
========================
НЕ
> some R function
============
========================
Например, как написать функцию, которая отобразит текущее время в консоли:
> some R function
13:01
становится
> some R function
13:02
НЕ
> some R function
13:01
13:01
13:01
13:01
13:02
13:02
13:02
13:02
Ответы
Ответ 1
Эта программа работает:
while (1) {
cat('\b\b\b\b\b\b',format(Sys.time(),'%H:%M'))
flush.console()
}
Есть ли причины, по которым это может быть плохой идеей?
/edit: еще лучше (спасибо @Greg Snow):
while (1) {
cat('\r',format(Sys.time(),'%H:%M:%S'))
flush.console()
}
Ответ 2
Вместо "\ b\b\b\b" вы можете просто использовать "\ r", чтобы перейти к началу строки и перезаписать все на линии (обязательно по-прежнему использовать кошку и не вставлять ее строка).
Однако, если вы хотите отобразить прогресс, возможно, лучше использовать winProgressBar (только для Windows) или tkProgressBar (пакет tcltk, все платформы), которые могут быть обновлены с помощью метки в дополнение к индикатору выполнения.
В окнах вы также можете использовать функции setWindowTitle или setStatusBar для размещения этого типа информации в верхней или нижней части большего окна.
Ответ 3
Конечно, вы можете:
while(1) {
cat("\b\b\b\b\b\b\b\b",format(Sys.time(), "%H:%M:%S"),sep="")
}
Ответ 4
Я не думаю, что перезапись возможна на консоли. Нет escape-последовательности в обратном пространстве. Индикатор выполнения может быть нарисован, потому что функция cat не будет выделять cr
, если не будет сказано об этом.
Изменить:
Я был неправ. Символ обратного пробела распознается:
for (i in 1:1000) {
cat(as.character(Sys.time()))
flush.console()
for(i in 1:19) {cat("\8")} }