r - R 中 cat 函数中回车符内的换行符

标签 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
}

控制台 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/

相关文章:

Emacs、ESS、R - 我是怎么做到的?

r - R 中的屏蔽函数

c# - VB 编译器不隐式转换为对象?

c++ - 如何让编译器知道调用哪个函数重载以避免歧义?

r - 如何将数字 ID 作为字符串导入,而不是四舍五入

r - 如何使用 httr GET 命令刷新或重试特定网页?

c++ - 是否可以在类定义之外以某种方式提供相当于 operator bool cast 的东西?

javascript - javascript textarea POST换行MySQL

ios - 根据找到的字符换行

css - 无序列表换行问题