实际上,我想在需要大量时间的计算过程中跟踪一些统计数据。这是一个可重现的示例,即使它对您来说没有意义,但对我来说从这里开始更容易,因为我不想解释我的整个问题并放置我的整个代码。所以有一个计算,一个生成随机数的 while 循环,它应该花费很多时间。在此循环期间,我想跟踪一些统计数据。所以我想跟踪到目前为止的最小值是多少,到目前为止的最大值是多少,迭代的次数等等......所以用 cat 函数很容易做到这一点。问题是,如果我按照常规方式执行此操作,则每次迭代都会添加一个新输出。参见代码:
i=1
min=99
max=-99
while(i<10000) {
x=rnorm( 1, 0, 2 )
if (x<min)min=x
if (x>max)max=x
cat("\niteration :",i)
cat("\nmin :",min)
cat("\nmax :",max)
i=i+1
}
控制台 View :
...
iteration : 9997
min : -6.670651
max : 7.082235
iteration : 9998
min : -6.670651
max : 7.082235
iteration : 9999
min : -6.670651
max : 7.082235
要解决此问题,可以使用\r 分隔符。它工作得很好,但它把我想要跟踪的一堆统计数据放在同一条线上。这是代码:
i=1
min=99
max=-99
while(i<10000) {
x=rnorm( 1, 0, 2 )
if (x<min)min=x
if (x>max)max=x
cat("\riteration :",i, "min : ",min, "max : ", max)
i=i+1
}
控制台 View (几乎不错)
iteration : 7747 (running) min : -7.173628 (running) max : 7.713919988887 (running)
我的预期结果是我想堆叠统计信息,我想在\r 分隔符内插入换行符,如下所示:
iteration : 4512 (running)
min : -2.315584 (running)
max : 3.215478 (running)
当我在代码中添加“\r”和“\n”分隔符时,如下所示:
i=1
min=99
max=-99
while(i<10000) {
x=rnorm( 1, 0, 2 )
if (x<min)min=x
if (x>max)max=x
cat("\riteration :",i, "\nmin : ",min, "\nmax : ", max)
i=i+1
}
它没有产生预期的结果,每次迭代都有一个换行符!
...
min : -8.344142
iteration : 9997
min : -8.344142
iteration : 9998
min : -8.344142
iteration : 9999
min : -8.344142
max : 7.99123
对于每次迭代,它都会在控制台中写入两行。我的问题是,我希望我的代码在整个循环中只生成两行,但我希望用正确的值刷新这些行。感谢您的帮助。
最佳答案
尝试:
cat(format(Sys.time(),'%H:%M:%S'), '\nHi People')
23:34:46
Hi People
当使用 while
循环时,R 将测试条件并循环执行函数,直到不再满足或包含断点条件。您编写的循环将无限期地运行。
更新
有了新数据,问题就更清楚了。我认为这是不可能的。您可能必须坚持一行。
原因是因为每次调用cat()
之后,评估器都会停止并准备下一个操作。
我将通过使用星号 *
来指示行位置在函数开头的位置,并使用美元符号 $
来指示它在函数开头的位置来进行演示。函数调用结束。
cat(1)
*1$
cat(1, "\n")
*1
$
cat(1, "\r")
^1
我必须使用一个新角色来表明它在同一位置开始和结束。
现在解释一下为什么我认为多行返回是不可行的:
cat(1, "\n", 2, "\r")
*1
$2
回车只能回到打印的最后一行的开头。一旦使用新行字符“\n”
,就好像第一行对于打印方法来说是遥远的内存。您正在尝试跳回顶部以更改第一行的值。没有办法再访问第一行了。这有点像回到过去,据我所知这是不可能的。
实现这一目标的一种方法是使用换页符"\f"
。它将充当“新页面”效果。但它会一遍又一遍地打印和删除。它会给你多条线,但也会产生闪烁效果。
for(i in 1:10000) {
cat("\fOpening Message", i, "\n\nSecond line", i+10)
}
关于r - R 中 cat 函数中回车符内的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32900110/