【问题标题】:How to create periodically send text to a "log file" while printing normal output to console?如何在将正常输出打印到控制台时定期将文本发送到“日志文件”?
【发布时间】:2014-05-15 15:27:40
【问题描述】:

我正在为一项职业运动的蒙特卡洛模拟创建 R 代码。因为游戏动态非常复杂,并且为了简化调试过程,我想让 R 将游戏中发生的每个动作的一行文本发送到“日志文件”。日志文件将是对模拟中发生的事情的全面、逐个描述,看起来像这样……

  • “游戏开始”
  • 所有权分配给 X 团队
  • 球员 Y 得到球
  • 球员 Y 得分
  • 球员 Z 犯规
  • 发生换人(球员 W 球员 Q)
  • “游戏结束”

我不能只使用 sink() 函数,因为在模拟运行时,我设置了一个进度条(使用 setTxtProgressBar 函数)并将实时分数打印到控制台。如果我使用 sink(),我在 R 控制台上看不到任何进度指示器或分数。这有意义吗?换句话说,我需要以累积的方式定期将文本发送到日志文件。下面是一些示例代码,可以为您提供一些可以使用的东西……

谢谢

for (i in 1:100)
{**SOMEHOW NEED TO PRINT LINE "START LOOP" TO LOG FILE**;
a <- rnorm(n = 100, mean = i, sd = 5);
print(mean(a)); #PRINT THIS MEAN TO THE CONSOLE
**SOMEHOW PRINT "LOOP 'i' COMPLETE" TO LOG FILE**}

【问题讨论】:

    标签: r


    【解决方案1】:

    write("这条消息", file=stderr())

    【讨论】:

      【解决方案2】:

      ?cat。您可以打开与您的日志文件的文件连接,并在您的 cat 调用中指定它。当您不指定文件名或连接时,它将打印到控制台。

      正如你所说,不要使用sink(),因为它会使日志文件成为默认连接。而是使用file() 打开一个命名连接。

      > log_con <- file("test.log")
      > cat("write to log", file = log_con) # creates file and writes to it
      > cat("write to console") # prints to console
      write to console
      

      上面的结果是一个日志文件,控制台上打印了“write to log”和“write to console”这行。

      如果您需要附加到日志文件,请设置 append = TRUE 并使用文件名而不是 file() 连接。

      > cat("add to log", file = "test.log", append = TRUE)
      

      【讨论】:

      • 这几乎可以满足我的需求!唯一的问题是,它不会以累积的方式将文本添加到日志文件中。也就是说,每次我运行循环时,它都会清除该日志文件,并且当循环完成时,日志文件中只保留最后一行。有没有办法让它累积起来?
      • ?catappend 的默认值为 false,但如果将其设置为 true 并使用文件名而不是连接名,它将追加(即累积添加)。
      • 文件模式注意事项:每次新运行时覆盖日志文件使用'w'模式,不断追加到同一个文件使用'a'模式。例如log_file = file("fileoutput.log",open = 'w')
      【解决方案3】:

      库 log4r 似乎比自制的更完整:https://github.com/johnmyleswhite/log4r

      【讨论】:

        【解决方案4】:

        感谢 shujaa 和 BigFinger。总而言之,以下是您将如何使用我的示例代码:

        log_con <- file("/filepath/log.txt", open="a")
        
        for (i in 1:100)
        {
        cat("loop begins", file = log_con, sep="\n")
        a <- rnorm(n = 100, mean = i, sd = 5)
        print(mean(a))
        cat("single loop completed", file = log_con, sep="\n")
        }
        
        close(log_con)
        

        【讨论】:

          【解决方案5】:

          以“追加”模式打开日志文件:

          log_con <- file("test.log",open="a")
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-24
            • 2021-06-05
            • 1970-01-01
            • 2022-12-04
            • 2017-02-09
            • 2018-05-05
            • 1970-01-01
            • 2011-11-02
            相关资源
            最近更新 更多