2015-10-20 39 views
0

我需要显示循环内各种变量的变化值(以跟踪我的分配算法正在做什么;数据集太大,无法每次都等待输出以确定行为是否合意)。如何在不清除控制台的情况下显示更新的输出?

目前我使用以下逻辑...

i <- 90 
while (i < 105) { 
cat("\r", paste("count value = ",as.character(i %% 99))) 
Sys.sleep(0.25) 
i <- i + 1} 

这将显示输出作为...

count value = 11 

的问题是,上述代码仅覆盖所显示的输出。所以,当我们到i = 101,屏幕显示...

count value = 28 

的,而不是...

count value = 2 

...其中最后一个数字8是一个遗留下来的先前显示输出。

该命令仅覆盖显示器。

cat("\014", paste("count value = ",as.character(i %% 99)))可以使用,但它每次清除整个控制台这是另一个问题。

有没有办法清除显示行而不清除控制台,但不只是覆盖?这是我正在做的一个小版本,当使用大尺寸的多个数字进行显示时,它变得非常混乱。

+0

为什么你使用'while'循环时,你应该使用'for'循环? – Roland

+0

@Roland没有特别的理由,除了较长的代码之外,是否有区别? – Gaurav

+0

这是非常不寻常的,并且可读性稍差(当然,编写起来不太方便)。自从一年多以来,我没有在R中使用过“while”循环。 (如果我真的需要一个,我可能会转向Rcpp。) – Roland

回答

2

在写入控制台之前,您可以考虑格式化数字,因为前导零将解决您的问题。

i <- 1 
while (i < 100000) { 
    cat("\r",sprintf("count value = %02d",i %% 99)) 
    Sys.sleep(0.25) 
    i <- i + 1} 

另一种解决方案可能是一个很大的空间先写入到控制台:

i <- 1 
while (i < 100000) { 
    cat("\r", paste(rep(" ",20))) 
    cat("\r", paste("count value = ",as.character(i %% 99))) 
    Sys.sleep(0.25) 
    i <- i + 1} 
+2

或者,'%2i'将避免前导零并仍然解决问题。 – Roland

相关问题