모든 콘솔 출력을 R의 파일에 저장하는 방법은 무엇입니까?


82

모든 콘솔 텍스트를 파일 로 리디렉션하고 싶습니다 . 내가 시도한 것은 다음과 같습니다.

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

내가 도대체 ​​뭘 잘못하고있는 겁니까? 감사!


답변:


106

"출력"과 "메시지"를 별도로 싱크해야합니다 ( 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출력, 다음 등을보고 싶습니다. 이런 유형의 로그를 생성하려는 이유는 실행하는 데 30GB 이상의 RAM이 필요한 프로그램이 있기 때문입니다. Amazon 클라우드에서 실행하고 회귀의 출력을 개별 파일에 저장합니다. 로그를보고 각 파일을 생성 한 코드를 빠르게 찾을 수 있기를 바랍니다. 참고 : 콘솔 출력을 잘라내어 붙여 넣기 만하면됩니다.
user443854 aug.

5
@ user443854 그렇다면 대화 형 작업을 중단하고 스크립트로 작업하는 것이 좋습니다.
mbq

5
@ user443854 : 예, 스크립트에 코드를 넣을 수 있습니까? 이 경우 source ( "script.R", echo = TRUE)가 트릭을 수행합니다. 위에서 설명한대로 출력을 리디렉션하면됩니다.
Tommy

@Tommy 당신은 남자입니다. 감사! .R 스크립트가 있지만 원격 상자의 대화 형 세션에 붙여 넣었습니다. 소싱이 트릭입니다.
user443854

2
@ user443854 : 예, max.deparse.length인수를 사용하십시오 . 답변을 업데이트했습니다.
Tommy

10

명령 줄에 액세스 할 수있는 경우 R CMD BATCH를 사용하여 명령 줄에서 스크립트를 실행하는 것이 좋습니다.

== 스크립트 내용 시작 R ==

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

== 스크립트의 끝 내용 R ==

명령 프롬프트 (많은 un * x 변형에서는 "$", Windows에서는 "C :>")에서 다음을 실행합니다.

$ R CMD BATCH script.R &

후행 "&"는 선택 사항이며 백그라운드에서 명령을 실행합니다. 로그 파일의 기본 이름은 확장자에 "out"이 추가되어 있습니다 (예 : 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
어떤 이유로 R CMD BATCH script.R &작동하지 않는 zsh를 사용하고 있습니다.
Gilbert

3

당신은 할 수 없습니다. 기껏해야 출력을로 저장 sink하고로 입력 할 수 있습니다 savehistory. 또는 script, screen또는 같은 외부 도구를 사용 tmux합니다.


2

ESS (Emacs Speaks Statistics) r- 모드로 emacs에서 R을 실행합니다. 내 스크립트와 R 코드로 하나의 창이 열려 있습니다. 다른 하나는 R이 실행 중입니다. 구문 창에서 코드가 전송되고 평가됩니다. 명령, 출력, 오류 및 경고는 모두 실행중인 R 창 세션에 나타납니다. 작업 기간이 끝나면 모든 출력을 파일에 저장합니다. 내 이름 지정 시스템은 스크립트의 경우 * .R이고 저장 출력 파일의 경우 * .Rout입니다. 다음은 예제가있는 스크린 샷입니다.Emacs / ESS로 R을 작성하고 평가하는 스크린 샷.


0

bash 쉘을 사용할 수있는 경우 bash 스크립트 내에서 R 코드를 실행하고 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

이를 위해 살펴볼 다른 사항은 R heredoc에서 stdout과 stderr를 로그 파일로 바로 파이핑하는 것입니다. 나는 이것을 아직 시도하지 않았지만 아마도 작동 할 것입니다.



0

많은 줄에 대한 Rgui 기본 설정을 지정한 다음 타임 스탬프를 지정하고 적절한 간격으로 파일로 저장합니다.


1
정교한하시기 바랍니다
bunbun

0

오류 메시지를 받으려면

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라는 파일에 인쇄됩니다.


0

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 단계 에서 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.