Jak zapisać wszystkie dane wyjściowe konsoli do pliku w R?


84

Chcę przekierować cały tekst konsoli do pliku. Oto, czego próbowałem:

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

Oto, co otrzymałem w test.log:

[1] "a"

Oto, czego chcę w test.log:

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

Co ja robię źle? Dzięki!


Odpowiedzi:


108

Musisz osobno ujrzeć „wyjście” i „wiadomość” ( sinkfunkcja patrzy tylko na pierwszy element type)

Teraz, jeśli chcesz, aby dane wejściowe były również rejestrowane, umieść je w skrypcie:

script.R

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

I po monicie:

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
Spowoduje to wydrukowanie tylko danych wyjściowych, ale nie wydrukuje danych wejściowych. Chcę zobaczyć linię wejściową, np. 1:5 + 1:3, A następnie jej wyjście, a następnie następną itd. Powodem, dla którego chcę tworzyć tego typu dzienniki, jest to, że mam program, który do uruchomienia zajmuje ponad 30 GB pamięci RAM. Uruchamiam go w chmurze amazon i zapisuję dane wyjściowe z regresji do pojedynczych plików. Chcę móc szybko znaleźć kod, który utworzył każdy plik, patrząc na dziennik. Uwaga: jeśli po prostu wycinam i wklejam dane wyjściowe konsoli, to wszystko.
user443854

5
@ user443854 Jeśli tak, lepszym pomysłem jest porzucenie pracy interaktywnej i praca ze skryptami.
mbq

5
@ user443854: Tak, czy możesz umieścić kod w skrypcie? W takim przypadku source ("script.R", echo = TRUE) załatwi sprawę - jeśli przekierujesz wyjście, jak wyjaśniono powyżej.
Tommy

@Tommy You the man. Dzięki! Mam skrypt .R, ale wklejałem go do sesji interaktywnej na zdalnym komputerze. Sourcing to załatwia sprawę.
user443854

2
@ user443854: Tak, użyj max.deparse.lengthargumentu. Zaktualizowałem odpowiedź.
Tommy

11

Jeśli masz dostęp do wiersza poleceń, możesz preferować uruchomienie skryptu z wiersza poleceń za pomocą R CMD BATCH.

== rozpocznij zawartość skryptu.R ==

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

== koniec treści skryptu.R ==

W wierszu polecenia („$” w wielu wariantach un * x, „C:>” w systemie Windows) uruchom

$ R CMD BATCH script.R &

Końcowy znak „&” jest opcjonalny i uruchamia polecenie w tle. Domyślna nazwa pliku dziennika ma „out” dołączony do rozszerzenia, tj. Script.Rout

== rozpocznij zawartość 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

== koniec zawartości script.Rout ==


1
Używam zsh, z jakiegoś powodu R CMD BATCH script.R &nie działa.
Gilbert,

4

Nie możesz. Co najwyżej możesz zapisać dane wyjściowe za pomocą sinki wejście savehistoryosobno. Lub użyć zewnętrznego narzędzia podobnego script, screenalbo tmux.


3

Uruchom R w emacsie z ESS (statystyki mówienia Emacsa) r-mode. Mam otwarte jedno okno ze skryptem i kodem R. Inny ma uruchomiony R. Kod jest wysyłany z okna składni i oceniany. Polecenia, dane wyjściowe, błędy i ostrzeżenia pojawiają się w uruchomionej sesji okna R. Pod koniec pewnego okresu pracy zapisuję wszystkie dane wyjściowe do pliku. Mój własny system nazewnictwa to * .R dla skryptów i * .Rout dla zapisywania plików wyjściowych. Oto zrzut ekranu z przykładem.Pisanie zrzutów ekranu i ocenianie języka R w Emacs / ESS.


1

Jeśli jesteś w stanie używać powłoki bash, możesz po prostu rozważyć uruchomienie kodu R z poziomu skryptu bash i przesłanie strumieni stdout i stderr do pliku. Oto przykład użycia heredoc:

Plik: 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 

Następnie po uruchomieniu skryptu z stderr i stdout przesłanymi potokiem do pliku dziennika:

$ 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

Innymi rzeczami, na które warto zwrócić uwagę, byłoby po prostu umieszczenie stdout i stderr bezpośrednio z R heredoc do pliku dziennika; Jeszcze tego nie próbowałem, ale prawdopodobnie też zadziała.



1

Ustaw preferencje Rgui dla dużej liczby wierszy, a następnie oznacz czas i zapisuj jako plik w odpowiednich odstępach czasu.


2
Proszę rozwinąć
bunbun

1

Możesz drukować do pliku i jednocześnie obserwować postępy (lub nie) screenpodczas uruchamiania skryptu R.

Kiedy nie używasz ekranu, użyj R CMD BATCH yourscript.R &i kroku 4.

  1. Podczas korzystania z ekranu w terminalu, ekran startowy

     screen
    
  2. uruchom skrypt R.

     R CMD BATCH yourscript.R
    
  3. Przejdź do innego ekranu, naciskając CtrlA, a następniec

  4. spójrz na swoje dane wyjściowe za pomocą (w czasie rzeczywistym):

     tail -f yourscript.Rout
    
  5. Przełączać się między ekranami z CtrlAczymn


1
  1. Jeśli chcesz, aby komunikaty o błędach zostały zapisane w pliku

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

    wynik będzie następujący:

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

    Te dane wyjściowe zostaną zapisane w pliku o nazwie Errors.txt

  2. W przypadku, gdy chcesz wydrukować wartości konsoli do pliku , możesz użyć argumentu 'split':

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

    wynik będzie:

    [1] "cool"
    

    w pliku console.txt. Zatem wszystkie dane wyjściowe konsoli zostaną wydrukowane w pliku o nazwie console.txt

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.