【问题标题】:Message within function (for status) not showing immediately in console函数内的消息(用于状态)未立即在控制台中显示
【发布时间】:2023-03-13 16:55:01
【问题描述】:

我编写了一个函数,它需要一些时间来运行(由于在一个巨大的数据集上进行了 1000 多个循环以及预测模型测试)。

为了了解状态,在调用函数时,我在函数的 for 循环内使用了message 命令。问题是函数完成后所有消息都显示在控制台中,而不是立即显示。所以它对我没有帮助:)

我试图在 Stackoverflow 上找到解决方案,但没有找到。例如,我查看了“showing a status message in R”这个问题。在处理函数后,该主题中的所有答案和示例代码仍然只在控制台中给我文本,而不是立即给我。

如何解决这个问题? R 中是否存在阻止在控制台中立即打印 message 文本的设置?

注意:我在下面尝试的示例,其结果与我的函数相同;处理函数后显示文本。

示例 1(约书亚·乌尔里希):

for(i in 1:10) {
  Sys.sleep(0.2)
  # Dirk says using cat() like this is naughty ;-)
  #cat(i,"\r")
  # So you can use message() like this, thanks to Sharpie's
  # comment to use appendLF=FALSE.
  message(i,"\r",appendLF=FALSE)
  flush.console()
}

例子2(泰勒):

test.message <- function() {
  for (i in 1:9){
    cat(i)
    Sys.sleep(1)
    cat("\b")
  }
}

编辑:第一个示例确实有效(“刷新控制台”是问题)...但是当我测试它时,出于某种原因我注释掉了刷新控制台:S

【问题讨论】:

  • 关于您的第二个示例,您可能需要刷新标准输出,因为您的字符串中没有换行符,因此可能不会立即打印该行。 flush(stdout()) 应该可以解决问题。

标签: r message


【解决方案1】:

您可能有兴趣使用其中一种进度条功能(winProgressBartkProgressBartxtProgressBar)。 win 版本只适用于 windows,但是 win 和 tk 版本的优点是不会弄乱你的输出,而是打开另一个小窗口并在那里显示进度。

可以使用进度条显示循环的进度,但可以使用label 参数更新和显示其他详细信息。

【讨论】:

    【解决方案2】:
    test.message <- function() {
         for (i in 1:9){
           cat(paste(as.character(i),'\n'))
           flush.console()
           Sys.sleep(1)
         }
       }
    

    类似于fotNelton的推荐。

    编辑:ttmaccer 很可能是正确的。我刚刚在 Ubuntu 服务器上进行了测试,代码可以在不刷新控制台的情况下运行。

    【讨论】:

    • 解决方案是flush.console()... 可能是 Windows 问题,正如 ttmaccer 所回答的那样。但我很高兴它有效......
    • 我们什么时候需要使用flush.console()?建议使用哪些命令:show、message、cat、print、...?
    【解决方案3】:

    我似乎认为这可能是 Windows 特定的问题。在 linux 上或在 cygwin shell 中运行 R 时可能不需要 flush.console()。

    【讨论】:

    • Windows 上默认是缓冲输出,flush.console 将缓冲的信息发送到控制台。 linux 的默认设置是不缓冲,所以flush.console 是不需要的,但并没有真正的伤害。
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2022-01-16
    • 2011-03-15
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2017-09-29
    • 2020-12-26
    相关资源
    最近更新 更多