Отображение счетчика для циклов через одну строку дисплея - PullRequest
7 голосов
/ 09 марта 2011

Я использую петли в R следующего вида:

for(i in 1:N){...}

Я хотел бы иметь счетчик, который отображает текущее значение i в ходе цикла. Я хочу, чтобы это отслеживало, как далеко я продвигаюсь к достижению конца цикла. Один из способов сделать это - просто вставить print(i) в код цикла. Например.,

for(i in 1:N){
...substantive code that does not print anything...
print(i)
}

Это делает работу, давая вам i, который работает. Проблема в том, что он печатает каждое значение в новой строке, а-ля,

[1] 1
[1] 2
[1] 3

Это съедает много места на консоли; если N велико, оно будет поглощать все пространство консоли. Я хотел бы иметь счетчик, который не съедает так много места на консоли. (Иногда приятно иметь возможность прокручивать консоль вверх, чтобы убедиться, что вы запускаете то, что, как вы думаете, вы запускаете.) Итак, я хотел бы иметь счетчик, который отображается как

[1] 1 2 3 ...

переход на новую строку после достижения ширины консоли. Я видел это время от времени. Есть какие-нибудь хитрости, чтобы это произошло?

Ответы [ 5 ]

9 голосов
/ 09 марта 2011

Попробуйте использовать функцию flush.console ()

for (i in 1:10){
 cat(paste(i, " ")); flush.console()
}

дает

1  2  3  4  5  6  7  8  9  10

Здесь небольшая модификация кода, которая будет печатать только одно число и увеличивать его при каждом запуске. Он использует последовательность возврата каретки (\ r), чтобы избежать длинного списка чисел в консоли.

for(i in 1:100) {  
  Sys.sleep(.1)      # some loop operations
  cat(i, "of 100\r") 
  flush.console()
}
7 голосов
/ 09 марта 2011

посмотрите на функции txtProgressBar, winProgressBar (только для windows) и tkProgressBar (пакет tcltk) как на другие способы отображения вашего прогресса в цикле.

На некоторых консолях вы также можете использовать "\ r" или "\ b" в операторе cat, чтобы вернуться к началу строки и переписать предыдущий номер итерации.

2 голосов
/ 10 марта 2011
1 голос
/ 04 января 2015

Попробуйте это для простых циклов:

 for(i in 1:100){
    Sys.sleep(.1) # Your code here
    cat("\r", i, "of", 100) 
    flush.console()
 }

Или это для вложенных циклов:

for(i in 1:100){
  for(j in 1:100){
    Sys.sleep(.1)  # Your code here
    cat("\r", i, ".", j, "of", 100, "\r") 
    flush.console()
  }
}
0 голосов
/ 10 марта 2011

Не очень хорошее решение, но вы можете попробовать что-то вроде этого в своем цикле:

cat(paste(i, ifelse(i %% 30 == 0,"\n"," ")))

Но вы должны вручную отрегулировать значение 30, чтобы соответствовать ширине вашей консоли.

...