Làm thế nào để lưu tất cả đầu ra của bảng điều khiển vào tệp trong R?


82

Tôi muốn chuyển hướng tất cả văn bản bảng điều khiển thành một tệp. Đây là những gì tôi đã thử:

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

Đây là những gì tôi nhận được trong test.log:

[1] "a"

Đây là những gì tôi muốn trong test.log:

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

Tôi đang làm gì sai? Cảm ơn!


Bạn có thể có một cái nhìn tại hướng dẫn này: statisticsglobe.com/r-save-all-console-input-output-to-file
Joachim Schork

Câu trả lời:


105

Bạn phải đặt "đầu ra" và "thông báo" riêng biệt ( sinkhàm chỉ xem xét phần tử đầu tiên của type)

Bây giờ nếu bạn cũng muốn dữ liệu đầu vào được ghi lại, thì hãy đặt nó vào một tập lệnh:

script.R

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

Và tại dấu nhắc:

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
Điều này chỉ in đầu ra, nhưng không in đầu vào. Tôi muốn xem dòng đầu vào, ví dụ: 1:5 + 1:3theo sau là đầu ra của nó, rồi tiếp theo, v.v. Lý do tôi muốn tạo loại nhật ký này là vì tôi có một chương trình sử dụng 30+ GByte RAM để chạy. Tôi chạy nó trên đám mây amazon và lưu đầu ra từ hồi quy thành các tệp riêng lẻ. Tôi muốn có thể nhanh chóng tìm thấy mã tạo ra mỗi tệp bằng cách xem nhật ký. Lưu ý: nếu tôi chỉ cắt-n-dán đầu ra bảng điều khiển, điều đó sẽ làm được.
user443854

5
@ user443854 Nếu vậy, tốt hơn hết bạn nên bỏ công việc tương tác và làm việc với tập lệnh.
mbq

5
@ user443854: Vâng, bạn có thể đặt mã trong một tập lệnh không? Trong trường hợp đó, nguồn ("script.R", echo = TRUE) sẽ thực hiện thủ thuật - nếu bạn chuyển hướng đầu ra như đã giải thích ở trên.
Tommy

@Tommy Bạn là người đàn ông. Cảm ơn! Tôi có một tập lệnh .R, nhưng tôi đã dán nó vào phiên tương tác trên hộp điều khiển từ xa. Tìm nguồn cung ứng nó thực hiện thủ thuật.
user443854

2
@ user443854: Vâng, hãy sử dụng max.deparse.lengthđối số. Tôi đã cập nhật câu trả lời.
Tommy

10

Nếu bạn có quyền truy cập vào một dòng lệnh, bạn có thể thích chạy tập lệnh của mình từ dòng lệnh với R CMD BATCH.

== bắt đầu nội dung của script.R ==

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

== nội dung cuối của script.R ==

Tại dấu nhắc lệnh ("$" trong nhiều biến thể un * x, "C:>" trong windows), hãy chạy

$ R CMD BATCH script.R &

Dấu "&" là tùy chọn và chạy lệnh trong nền. Tên mặc định của tệp nhật ký đã được thêm "out" vào phần mở rộng, tức là script.Rout

== bắt đầu nội dung của 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

== nội dung cuối của script.Rout ==


1
Tôi đang sử dụng zsh, vì một số lý do R CMD BATCH script.R &không hoạt động.
Gilbert

3

Bạn không thể. Tối đa bạn có thể lưu đầu ra với sinkvà đầu vào với savehistoryriêng biệt. Hoặc sử dụng công cụ bên ngoài như script, screenhoặc tmux.


2

Chạy R trong emacs với chế độ r ESS (Emacs Speaks Statistics). Tôi có một cửa sổ đang mở với tập lệnh và mã R của mình. Khác có R đang chạy. Mã được gửi từ cửa sổ cú pháp và được đánh giá. Tất cả các lệnh, đầu ra, lỗi và cảnh báo đều xuất hiện trong phiên cửa sổ R đang chạy. Vào cuối một số khoảng thời gian làm việc, tôi lưu tất cả đầu ra vào một tệp. Hệ thống đặt tên của riêng tôi là * .R cho các tập lệnh và * .Rout để lưu các tệp đầu ra. Đây là một ảnh chụp màn hình với một ví dụ.Viết ảnh chụp màn hình và đánh giá R bằng Emacs / ESS.


0

Nếu bạn có thể sử dụng bash shell, bạn có thể xem xét chỉ cần chạy mã R từ bên trong tập lệnh bash và chuyển dòng stdout và stderr vào một tệp. Đây là một ví dụ sử dụng heredoc:

Tập tin: 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 

Sau đó, khi bạn chạy tập lệnh với cả stderr và stdout được đưa vào tệp nhật ký:

$ 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

Những thứ khác cần xem xét cho điều này là thử chỉ cần gộp stdout và stderr ngay từ heredoc R vào một tệp nhật ký; Tôi chưa thử điều này nhưng có lẽ nó cũng sẽ hoạt động.



0

Đặt tùy chọn Rgui của bạn cho một số lượng lớn các dòng, sau đó đánh dấu thời gian và lưu dưới dạng tệp vào các khoảng thời gian phù hợp.


1
Xin nói rõ thêm
bunbun

0

Nếu bạn muốn nhận được thông báo lỗi

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

đầu ra sẽ là:

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

Đầu ra này sẽ được lưu trong một tệp có tên là Errors.txt

Trong trường hợp bạn muốn các giá trị được in của bảng điều khiển vào một tệp, bạn có thể sử dụng đối số 'tách':

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

đầu ra sẽ là:

[1] "cool"

trong tệp console.txt. Vì vậy, tất cả đầu ra bảng điều khiển của bạn sẽ được in trong một tệp có tên console.txt


0

Bạn có thể in ra tệp và đồng thời xem tiến trình có (hoặc không) screenchẳng hạn, trong khi chạy tập lệnh R.

  1. Trong một thiết bị đầu cuối, màn hình bắt đầu

    screen
    
  2. chạy tập lệnh R của bạn

    R CMD BATCH yourscript.R
    
  3. Chuyển đến màn hình khác nhấn CtrlA, sau đóc

  4. xem đầu ra của bạn với (thời gian thực):

    tail -f yourscript.Rout
    
  5. Chuyển đổi giữa các màn hình với CtrlAsau đón

Ngoài ra, khi không sử dụng màn hình, hãy sử dụng R CMD BATCH yourscript.R &ở bước 2.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.