Как создать периодическую отправку текста в "файл журнала" при печати обычного вывода на консоль?

Я создаю R-код для моделирования профессионального спорта в Монте-Карло. Поскольку динамика игры очень сложная и сделать процесс отладки проще, я бы хотел, чтобы R отправил строку текста для каждого действия, которое происходит в игре, в "файл журнала". Файл журнала был бы всеобъемлющим, поиграть описанием того, что происходит в симуляции, и будет выглядеть примерно так...

  • "НАЧАЛО ИГРЫ"
  • ПОЗИЦИЯ, НАЗНАЧЕННАЯ В X КОМАНДУ
  • ИГРОК Y GETS BALL
  • PLAYER Y SCORES
  • ПОСЛЕ ИГРОКА Z OCCURS
  • ЗАВЕРШЕНИЕ ПРОСМОТРЕТЬ (PLAYER W ↔ PLAYER 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**}

Ответ 1

Видишь ?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

Вышеуказанное приводит к созданию файла журнала со строкой "запись в журнал" и "запись в консоль", напечатанной на консоли.

Если вам нужно добавить файл журнала, установите append = TRUE и используйте имя файла вместо соединения file().

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

Ответ 2

Чтобы открыть файл журнала в режиме "добавить":

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

Ответ 3

Выяснил это, благодаря шуя и 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

написать ("это сообщение", file = stderr())