Tüm konsol çıktısını R'deki dosyaya nasıl kaydedebilirim?


84

Tüm konsol metnini bir dosyaya yeniden yönlendirmek istiyorum . İşte denediğim şey:

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

İşte test.log'da bulduklarım:

[1] "a"

İşte test.log'da istediğim şey:

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

Neyi yanlış yapıyorum? Teşekkürler!


Yanıtlar:


108

"Çıktı" ve "mesajı" ayrı ayrı almalısınız ( sinkişlev yalnızca öğesinin ilk öğesine bakar type)

Şimdi, girdinin de günlüğe kaydedilmesini istiyorsanız, onu bir komut dosyasına koyun:

script.R

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

Ve istendiğinde:

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
Bu, yalnızca çıktıyı yazdırır, ancak girdiyi yazdırmaz. Girdi satırını görmek istiyorum, örneğin 1:5 + 1:3, onun çıktısını takip ediyor, sonra bir sonrakini, vb. Görmek istiyorum. Bu tür bir günlük oluşturmak istememin nedeni, çalıştırmak için 30+ GB RAM alan bir programım olması. Bunu amazon bulutunda çalıştırıyorum ve regresyonların çıktılarını tek tek dosyalara kaydediyorum. Günlüğe bakarak her dosyayı oluşturan kodu hızlı bir şekilde bulabilmek istiyorum. Not: Konsol çıktısını sadece kesip yapıştırırsam, bunu yapar.
user443854

5
@ user443854 Öyleyse, etkileşimli çalışmayı bırakıp komut dosyalarıyla çalışmak daha iyi bir fikirdir.
mbq

5
@ user443854: Evet, kodu bir komut dosyasına koyabilir misin? Bu durumda, kaynak ("script.R", echo = TRUE) hile yapardı - eğer çıktıyı yukarıda açıklandığı gibi yeniden yönlendirirseniz.
Tommy

@Tommy Sen adamsın. Teşekkürler! Bir .R betiğim var, ancak onu uzak kutudaki etkileşimli oturuma yapıştırıyordum. Kaynak bulmak hile yapar.
user443854

2
@ user443854: Evet, max.deparse.lengthargümanı kullanın . Cevabı güncelledim.
Tommy

11

Bir komut satırına erişiminiz varsa, komut dosyanızı R CMD BATCH ile komut satırından çalıştırmayı tercih edebilirsiniz.

== script içeriğine başlayın.R ==

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

== komut dosyasının içeriğini sonlandır.R ==

Komut isteminde (birçok un * x varyantında "$", pencerelerde "C:>"), şunu çalıştırın:

$ R CMD BATCH script.R &

Sondaki "&" isteğe bağlıdır ve komutu arka planda çalıştırır. Günlük dosyasının varsayılan adı uzantıya "out" eklenmiştir, yani script.Rout

== script içeriğine başlayın.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 == içeriğini sonlandır


1
Zsh kullanıyorum, nedense R CMD BATCH script.R &çalışmıyor.
Gilbert

4

Yapamazsın. En fazla ile çıktıyı sinkve girişi savehistoryayrı ayrı kaydedebilirsiniz . Veya script, screenveya gibi harici bir araç kullanın tmux.


3

ESS (Emacs Speaks Statistics) r modu ile emac'lerde R çalıştırın. Komut dosyam ve R kodumla açık bir pencerem var. Bir başkasında R çalışıyor. Kod sözdizimi penceresinden gönderilir ve değerlendirilir. Komutlar, çıktılar, hatalar ve uyarıların tümü çalışan R penceresi oturumunda görünür. Bir çalışma süresinin sonunda tüm çıktıyı bir dosyaya kaydederim. Kendi adlandırma sistemim komut dosyaları için * .R ve çıktı dosyalarını kaydetmek için * .Rout şeklindedir. İşte örnek içeren bir ekran görüntüsü.Emacs / ESS ile R'nin yazılması ve değerlendirilmesi.


1

Bash kabuğunu kullanabiliyorsanız, basitçe R kodunu bir bash betiğinden çalıştırmayı ve stdout ve stderr akışlarını bir dosyaya aktarmayı düşünebilirsiniz. İşte yorumlu metin kullanan bir örnek:

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

Ardından, betiği hem stderr hem de stdout bir günlük dosyasına borulu olarak çalıştırdığınızda:

$ 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

Bunun için bakılması gereken diğer şeyler, stdout ve stderr'i doğrudan R heredoc'tan bir günlük dosyasına aktarmayı denemek olacaktır; Bunu henüz denemedim ama muhtemelen işe yarayacak.



1

Rgui tercihlerinizi çok sayıda satır için ayarlayın, ardından zaman damgası alın ve uygun aralıklarla dosya olarak kaydedin.


2
Lütfen detaylandırın
bunbun

1

Dosyaya yazdırabilir ve aynı zamanda ilerlemeyi (veya göstermeyen) görebilirsiniz. screenBir R betiğini çalıştırırken .

Ekranı kullanmadığınızda, R CMD BATCH yourscript.R &ve 4. adımı kullanın .

  1. Ekranı kullanırken, bir terminalde, başlangıç ​​ekranı

     screen
    
  2. R betiğinizi çalıştırın

     R CMD BATCH yourscript.R
    
  3. Tuşuna basarak başka bir ekrana gidin CtrlA, ardındanc

  4. çıktınıza bakın (gerçek zamanlı):

     tail -f yourscript.Rout
    
  5. CtrlAArdından ekranlar arasında geçiş yapın n


1
  1. Bir dosyaya kaydedilmiş hata mesajlarını almak istiyorsanız

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

    çıktı:

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

    Bu çıktı, Errors.txt adlı bir dosyaya kaydedilecektir.

  2. Durumda, istediğiniz bir dosyaya konsolun değerlerini baskılı sen 'bölünmüş' argümanını kullanabilirsiniz:

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

    çıktı:

    [1] "cool"
    

    console.txt dosyasında. Böylece tüm konsol çıktınız console.txt adlı bir dosyada yazdırılacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.