2011-03-09 84 views
6

我運行循環中R的以下各種:顯示跨一個顯示行的for循環的計數器

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 ... 

繼續一旦達到控制檯寬度,就可以將它們放到新的線上。我不時看到這一點。任何使這種情況發生的技巧?

+0

谷歌「r進度條」 – James 2011-03-09 17:17:27

回答

7

嘗試使用功能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() 
} 
+0

雖然不會包裝... – 2011-03-09 17:17:16

+0

的確,它不適當地包裝。它現在正在爲我的需求而工作,所以謝謝@Mark,但是如果有更好的包裝選項,那將會很棒。 – 2011-03-09 17:19:26

7

看功能txtProgressBar,winProgressBar(僅適用於Windows)和tkProgressBar(tcltk包)作爲顯示在一個循環的進度的其他方式。

在一些控制檯上,您還可以在cat語句中使用「\ r」或「\ b」返回到行首並覆蓋前一個迭代編號。

0

不是一個很好的解決方案,但你可以嘗試這樣的事情在你的循環:

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

但是你必須手動調整30值,以適應您的控制檯的寬度。

1

試試這個簡單的循環:

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() 
    } 
}