Подтвердить что ты не робот

Перезаписать ток в консоли 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
4b9b3361

Ответ 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")} }