R: перенаправление и на стандартный вывод, и на файл на лету

Есть ли способ перенаправить R-вывод в файл и одновременно распечатать его на stdout, на лету? Я хочу отслеживать прогресс и документировать его в файле. Похоже, что методink () не может делать и то, и другое.

Нашел функцию tee в Unix (я использую Mac и Linux), но может быть решение R. Спасибо!


person 4554888    schedule 16.04.2020    source источник
comment
См. Аргумент split - logical: if TRUE, output will be sent to the new sink and to the current output stream, like the Unix program tee.   -  person Rui Barradas    schedule 16.04.2020
comment
Спасибо, Руи, именно то, что мне нужно (пропустил чтение документации перед поиском ..).   -  person 4554888    schedule 17.04.2020
comment
Это работает для вывода, а не для сообщений об ошибках, но это хорошо: ошибка в приемнике (msg, type = message, split = TRUE): невозможно разделить соединение сообщения   -  person 4554888    schedule 17.04.2020


Ответы (2)


Функция sink - это стандартный способ R перенаправления вывода. У него есть аргумент split, который при установке в TRUE по-прежнему будет иметь вывод команд, печатаемых на stdout.
Из документации, мой акцент.

split
logic: если TRUE, вывод будет отправлен в новый приемник и в текущий поток вывода, как в программе Unix tee.

В следующем примере показано это поведение.
Сначала набор данных для выполнения команды с большим количеством записанных выходных данных.

set.seed(1234)
x <- 1:10
y <- x + rnorm(10, mean = 2, sd = 4)

Эти инструкции предназначены не для того, чтобы мешать моему рабочему пространству. Не стесняйтесь их пропускать.

old_dir <- getwd()
setwd('~/tmp')

Теперь пример с разделением sink.

sink(file = 'sink.txt', split = TRUE)
summary(lm(y ~ x))
sink(NULL)

summary вывод на стандартный вывод и в файл sink.txt.
Очистить.

unlink('sink.txt')

И обратно туда, где я был.

setwd(old_dir)
person Rui Barradas    schedule 16.04.2020

Возможно, вы можете отправить в приемник, скажем outfile.txt, а затем запустить tail -f outfile.txt в другом процессе?

sink("outfile.txt")
system("tail -f outfile.txt &")
person F Trias    schedule 16.04.2020