Як зберегти весь вивід консолі у файл у 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

Вам потрібно окремо синхронізувати "output" та "message" ( sinkфункція переглядає лише перший елемент type)

Тепер, якщо ви хочете, щоб вхідні дані також реєструвались, то помістіть їх у скрипт:

сценарій

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 і зберігаю вихідні дані з регресій в окремі файли. Я хочу мати можливість швидко знайти код, який створив кожен файл, переглянувши журнал. Примітка: якщо я просто вирізав n-paste на консолі, це робить.
user443854

5
@ user443854 Якщо так, то краще відмовитися від інтерактивної роботи та роботи зі сценаріями.
mbq

5
@ user443854: Так, чи можете ви помістити код у сценарій? У цьому випадку джерело ("script.R", echo = TRUE) зробить трюк - якщо ви перенаправите вихід, як пояснено вище.
Томмі,

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

2
@ user443854: Так, використовуй max.deparse.lengthаргумент. Я оновив відповідь.
Томмі,

11

Якщо у вас є доступ до командного рядка, ви можете віддати перевагу запуску сценарію з командного рядка за допомогою R CMD BATCH.

== почати зміст сценарію.R ==

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

== кінцевий вміст сценарію.R ==

У командному рядку ("$" у багатьох варіантах un * x, "C:>" у вікнах) запустіть

$ R CMD BATCH script.R &

Кінцевий "&" необов'язковий і виконує команду у фоновому режимі. Ім'я файлу журналу за замовчуванням додано до розширення, тобто script.Rout

== почати вміст скрипта.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

== кінцевий вміст сценарію.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 у файл. Ось приклад використання гередоку:

Файл: 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
Будь ласка,
уточніть

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.