如何在将正常输出打印到控制台时定期发送文本到"日志文件"?

Sly*_*ron 16 r

我正在为专业运动的蒙特卡罗模拟创建R代码.因为游戏动态非常复杂并且使调试过程更简单,所以我希望让R为游戏中发生的每个动作发送一行文本到"日志文件".日志文件将是一个全面的,通过播放描述模拟中发生的事情,看起来像这样......

  • "游戏开始"
  • 占有权分配给X队
  • 球员Y获得球
  • 球员Y分数
  • 玩家Z OCCURS
  • 替补发生(球员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**}
Run Code Online (Sandbox Code Playgroud)

Gre*_*gor 15

?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
Run Code Online (Sandbox Code Playgroud)

上面的结果是一个日志文件,在控制台上打印了"写入日志"和"写入控制台"行.

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

> cat("add to log", file = "test.log", append = TRUE)
Run Code Online (Sandbox Code Playgroud)


Big*_*ger 9

要以"追加"模式打开日志文件:

log_con <- file("test.log",open="a")
Run Code Online (Sandbox Code Playgroud)


Sly*_*ron 6

感谢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)
Run Code Online (Sandbox Code Playgroud)