Как сохранить весь вывод консоли в файл в R?

Я хочу перенаправить весь текст консоли в файл. Вот что я попробовал:

> sink("test.log", type=c("output", "message"))
> a <- "a"
> a
> How come I do not see this in log
Error: unexpected symbol in "How come"

Вот что я получил в test.log:

[1] "a"

Вот что я хочу в test.log:

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"

Что я делаю неправильно? Спасибо!

10 ответов

Решение

Вы должны потопить "вывод" и "сообщение" отдельно (sink функция смотрит только на первый элемент type)

Теперь, если вы хотите, чтобы вход также регистрировался, поместите его в скрипт:

script.R

1:5 + 1:3   # prints and gives a warning
stop("foo") # an error

И по подсказке:

con <- file("test.log")
sink(con, append=TRUE)
sink(con, append=TRUE, type="message")

# This will echo all input and not truncate 150+ character lines...
source("script.R", echo=TRUE, max.deparse.length=10000)

# Restore output to console
sink() 
sink(type="message")

# And look at the log...
cat(readLines("test.log"), sep="\n")

Если у вас есть доступ к командной строке, вы можете предпочесть запускать скрипт из командной строки с помощью R CMD BATCH.

== начать содержание скрипта.R ==

a <- "a"
a
How come I do not see this in log

== конец содержимого скрипта. R ==

В командной строке ("$" во многих un*x вариантах, "C:>" в Windows), запустите

$ R CMD BATCH script.R &

Конечный "&" является необязательным и запускает команду в фоновом режиме. К имени файла журнала по умолчанию добавлено "out", то есть script.Rout

== начать содержание script.Rout ==

R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: i686-pc-linux-gnu (32-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]

> a <- "a"
> a
[1] "a"
> How come I do not see this in log
Error: unexpected symbol in "How come"
Execution halted

== конец содержимого script.Rout ==

Если вы можете использовать оболочку bash, вы можете просто запустить код R из скрипта bash и передать потоки stdout и stderr в файл. Вот пример использования heredoc:

Файл: test.sh

#!/bin/bash
# this is a bash script
echo "Hello World, this is bash"

test1=$(echo "This is a test")

echo "Here is some R code:"

Rscript --slave --no-save --no-restore - "$test1" <<EOF
  ## R code
  cat("\nHello World, this is R\n")
  args <- commandArgs(TRUE)
  bash_message<-args[1]
  cat("\nThis is a message from bash:\n")
  cat("\n",paste0(bash_message),"\n")
EOF

# end of script 

Затем, когда вы запускаете сценарий с stderr и stdout, переданными в файл журнала:

$ chmod +x test.sh
$ ./test.sh
$ ./test.sh &>test.log
$ cat test.log
Hello World, this is bash
Here is some R code:

Hello World, this is R

This is a message from bash:

 This is a test

Другие вещи, на которые стоит обратить внимание, это попытаться просто вставить stdout и stderr прямо из R heredoc в файл журнала; Я еще не пробовал это, но это, вероятно, тоже будет работать.

Ты не можешь Максимум, вы можете сохранить вывод с sink и ввод с savehistory по отдельности. Или используйте внешний инструмент, как script, screen или же tmux,

Запустите R в Emacs с помощью R-режима ESS (Emacs Speaks Statistics). У меня открыто одно окно с моим скриптом и R-кодом. У другого R работает. Код отправляется из окна синтаксиса и оценивается. Команды, выходные данные, ошибки и предупреждения отображаются в сеансе R-окна. В конце некоторого периода работы я сохраняю весь вывод в файл. Моя собственная система именования - *.R для скриптов и *.Rout для сохранения выходных файлов. Вот скриншот с примером. Написание скриншота и оценка R с помощью Emacs / ESS

Вы можете распечатать в файл и в то же время увидеть прогресс, имея (или нет) screen например, при запуске сценария R.

  1. В терминале начальный экран

    screen
    
  2. запустите свой R скрипт

    R CMD BATCH yourscript.R
    
  3. Перейти к другому экрану, нажав CtrlA, затемc

  4. посмотрите на свой вывод (в реальном времени):

    tail -f yourscript.Rout
    
  5. Переключайтесь между экранами с помощью CtrlA затемn

В качестве альтернативы, если экран не используется, используйте R CMD BATCH yourscript.R & на шаге 2.

Установите настройки Rgui для большого количества строк, затем отметьте время и сохраните как файл с подходящими интервалами.

Чтобы сохранить текст из консоли: запустите анализ и затем выберите (Windows) "Файл> Сохранить в файл".

Если вы хотите получать сообщения об ошибках

zz <- file("Errors.txt", open="wt")
sink(zz, type="message")

вывод будет:

Error in print(errr) : object 'errr' not found
Execution halted

Этот вывод будет сохранен в файле с именем Errors.txt.

Если вы хотите, чтобы значения консоли выводились в файл, вы можете использовать аргумент split:

zz <- file("console.txt", open="wt")
sink(zz,  split=TRUE)
print("cool")
print(errr)

вывод будет:

[1] "cool"

в файле console.txt. Таким образом, весь вывод вашей консоли будет напечатан в файле с именем console.txt.

Это может не сработать для ваших нужд, но одним из решений может быть запуск вашего кода из файла Rmarkdown. Вы можете написать как код, так и вывод консоли в HTML/PDF/Word.

Другие вопросы по тегам