实际上,我想在计算过程中跟踪一些统计数据,这需要花费很多时间。这是一个可重复的例子,即使它对你没有意义,但我从这里开始更容易,因为我不想解释我的整个问题并把我的整个代码。所以有一个计算,一个生成随机数的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
}
控制台视图:
...
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
}
控制台视图(几乎不错)
iteration : 7747 (running) min : -7.173628 (running) max : 7.713919988887 (running)
我的预期结果是我想要堆叠统计信息,我想在\ r \ n分隔符中插入一个换行符,如下所示:
iteration : 4512 (running)
min : -2.315584 (running)
max : 3.215478 (running)
当我添加&#34; \ r&#34;和&#34; \ n&#34;我的代码中的分隔符如下:
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
对于每次迭代,它在控制台中写入两行。我的问题是我希望我的代码只为整个循环生成两行,但我希望这些行用良好的值刷新。谢谢你的帮助。
答案 0 :(得分:2)
尝试:
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"
后,就像第一行是打印方法的远程内存。您正试图跳回到顶部以更改第一行的值。没有方法可以访问第一行。它有点像回到过去,据我所知,这是不可能的。
一种方法是使用表单Feed "\f"
。它将作为一个新的页面&#34;影响。但它会一遍又一遍地打印和擦除。它会给你多行,但也会产生闪烁效果。
for(i in 1:10000) {
cat("\fOpening Message", i, "\n\nSecond line", i+10)
}
答案 1 :(得分:0)
对于你想要完成的事情并不是肯定的(即我不明白你为什么需要回车或&#39; \ r&#39;),但这应该给你你想要的输出:
while(1) {
cat(format(Sys.time(), "%H:%M:%S"))
cat(" (running of course)")
cat("\nHi People\n")
}