Перезаписать токовый выход в консоли R - PullRequest
13 голосов
/ 10 мая 2011

Я играл с функцией 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

Ответы [ 4 ]

13 голосов
/ 10 мая 2011

Вместо "\ b \ b \ b \ b" вы можете просто использовать "\ r", чтобы перейти к началу строки и перезаписать все в строке (убедитесь, что вы по-прежнему используете cat и не вводите перевод строки).

Хотя, если вы хотите отобразить прогресс, может быть лучше использовать winProgressBar (только для windows) или tkProgressBar (пакет tcltk, все платформы), который можно обновить с помощью метки в дополнение к индикатору выполнения.

В окнах вы также можете использовать функции setWindowTitle или setStatusBar, чтобы поместить информацию такого типа в верхнюю или нижнюю часть большого окна.

13 голосов
/ 10 мая 2011

Эта программа работает:

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() 
}
4 голосов
/ 10 мая 2011

Конечно, вы можете:

while(1) {
  cat("\b\b\b\b\b\b\b\b",format(Sys.time(), "%H:%M:%S"),sep="")
}
1 голос
/ 10 мая 2011

Я не думаю, что перезапись возможна на консоли. Там нет последовательности возврата Backspace. Индикатор выполнения может быть нарисован, потому что функция cat не будет выдавать cr, если это не указано.

Edit: Я был неправ. Символ возврата на одну позицию распознается:

for (i in 1:1000) {
     cat(as.character(Sys.time())) 
     flush.console() 
     for(i in 1:19) {cat("\8")} }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...