如何将所有控制台输出保存到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"

我究竟做错了什么?谢谢!


Answers:


105

您必须分别接收“输出”和“消息”(该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 GB以上的RAM才能运行。我在亚马逊云中运行它,并将回归输出保存到单个文件。我希望能够通过查看日志快速找到产生每个文件的代码。注意:如果我只是剪切n粘贴控制台输出,那就可以了。
user443854 2011年

5
@ user443854如果是这样,最好删除交互式工作并使用脚本。
mbq 2011年

5
@ user443854:是的,您可以将代码放在脚本中吗?在那种情况下,source(“ script.R”,echo = TRUE)可以解决问题-如果您如上所述重定向输出。
汤米

@Tommy你这个男人。谢谢!我确实有一个.R脚本,但是我将其粘贴到远程框中的交互式会话中。采购可以解决问题。
user443854 2011年

2
@ user443854:是的,使用max.deparse.length参数。我更新了答案。
汤米

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
我正在使用zsh,由于某种原因,R CMD BATCH script.R &它无法正常工作。
吉尔伯特2016年

3

你不能 最多可以单独保存输出sink和输入savehistory。或使用scriptscreen或这类外部工具tmux


2

使用ESS(Emacs语音统计)r模式在emacs中运行R。我打开了一个包含脚本和R代码的窗口。另一个正在运行R。代码从语法窗口发送并评估。命令,输出,错误和警告全部出现在正在运行的R窗口会话中。在某个工作期结束时,我将所有输出保存到文件中。我自己的命名系统是用于脚本的* .R和用于保存输出文件的* .Rout。这是带有示例的屏幕截图。使用Emacs / ESS编写和评估R的屏幕截图。


0

如果您能够使用bash shell,则可以考虑仅在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

其他需要考虑的事情是尝试简单地将Rd.doc中的stdout和stderr插入日志文件中。我还没有尝试过,但它可能也可以工作。




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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.