R

时间:2015-10-02 03:25:10

标签: r casting line-breaks carriage-return

实际上,我想在计算过程中跟踪一些统计数据,这需要花费很多时间。这是一个可重复的例子,即使它对你没有意义,但我从这里开始更容易,因为我不想解释我的整个问题并把我的整个代码。所以有一个计算,一个生成随机数的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

对于每次迭代,它在控制台中写入两行。我的问题是我希望我的代码只为整个循环生成两行,但我希望这些行用良好的值刷新。谢谢你的帮助。

2 个答案:

答案 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")
}