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


84

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

> 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"

Что я делаю неправильно? Благодаря!


Вы можете взглянуть на этот учебник: statisticsglobe.com/r-save-all-console-input-output-to-file
Иоахим Шорк,

Ответы:


108

Вы должны обрабатывать «вывод» и «сообщение» отдельно ( 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")

2
Это печатает только вывод, но не вводит. Я хочу увидеть строку ввода, например 1:5 + 1:3, за ней следует ее вывод, затем следующий и т. Д. Причина, по которой я хочу создать журнал этого типа, заключается в том, что у меня есть программа, для выполнения которой требуется более 30 ГБ ОЗУ. Я запускаю его в облаке Amazon и сохраняю результаты регрессий в отдельные файлы. Я хочу иметь возможность быстро находить код, создавший каждый файл, просматривая журнал. Примечание: если я просто вырезал консольный вывод и вставил его, это будет сделано.
user443854

5
@ user443854 Если это так, то лучше отказаться от интерактивной работы и работать со сценариями.
mbq

5
@ user443854: Ага, а можно вставить код в скрипт? В этом случае источник ("script.R", echo = TRUE) сделает свое дело - если вы перенаправите вывод, как описано выше.
Tommy

@Tommy Ты мужчина. Благодаря! У меня есть сценарий .R, но я вставлял его в интерактивный сеанс на удаленном компьютере. Его поиск делает свое дело.
user443854

2
@ user443854: Да, используйте max.deparse.lengthаргумент. Я обновил ответ.
Tommy

11

Если у вас есть доступ к командной строке, вы можете предпочесть запускать свой сценарий из командной строки с помощью 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

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

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

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


1
Пользуюсь zsh, почему-то R CMD BATCH script.R &не работает.
Гилберт

4

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


3

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


1

Если вы можете использовать оболочку 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 в файл журнала; Я еще не пробовал, но, вероятно, тоже сработает.



1

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


2
Пожалуйста, уточните
bunbun

1

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

Если экран не используется, используйте R CMD BATCH yourscript.R &и шаг 4.

  1. При использовании экрана в терминале стартовый экран

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

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

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

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


1
  1. Если вы хотите, чтобы сообщения об ошибках сохранялись в файле

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

    вывод будет:

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

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

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

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

    вывод будет:

    [1] "cool"
    

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.